@altai2013

Отправка почты через msmtp — почему из консоли пользователя работает, а от вебсервера — нет?

Установил msmtp на сервер (ubuntu 16.04), чтобы отправлять почту через smtp Яндекса и никак не могу отладить бесследную пропажу писем, которая происходит при попытке использовать mail() в php-файлах веб-сервера. В консоли всё работает отлично, делаю
php -r "mail('mymail@yandex.ru', 'Test Subject', 'Test Message');"
и письмо мгновенно приходит на mymail@yandex.ru
Делаю такой же вызов mail() из php-файла через браузер - ничего не происходит.
В стандартном логе msmtp (/var/log/msmtp/msmtp.log) фиксируется только отправка почты из консоли. Вызовы от веб-сервера в нём никак не отражаются. В логе nginx (/var/log/nginx/error.log) никаких ошибок нет. В php.ini (/etc/php/7.0/fpm/php.ini) прописал:
sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc -a myaccountname -t"
mail.log = /var/log/maillog

В лог maillog вызовы mail() от сервера попадают, но выглядят как-то странно:
[18-Dec-2017 15:09:30 Asia/Krasnoyarsk] mail() on [/var/www/mydomain.com/html/wp-content/themes/mywebsite/send.php:23]: To: mymailbox@yandex.ru -- Headers:

То есть, полезной информации практически никакой и ошибок я не вижу. :(
Может, проблема в конфигурационном файле msmtp? При вызове mail() из консоли пользователя, конфиг читается из домашнего каталога пользователя и этот сценарий работает отлично. При вызове mail() из файла на веб-сервере, запуск msmtp происходит от пользователя www-data и в этом случае он должен читать конфигурационный файл в папке по умолчанию: /etc/msmtprc. Этот файл существует, его содержимое такое же, как у файла в домашней папке пользователя ~/.msmtprc Права на доступ к файлу одинаковые (0600), как в /etc/msmtprc, так и в ~/.msmtprc, только в первом случае владельцем файла является www-data (чтобы nginx мог читать его), а во втором - обычный пользователь, в домашней папке которого лежит конфиг. Не вижу ошибку в конфигурации, но очевидно, что она есть, если с веб-сервера почта не уходит. Подскажите куда ещё можно копнуть и где посмотреть, чтобы отыскать причину проблемы?
  • Вопрос задан
  • 4700 просмотров
Решения вопроса 1
@altai2013 Автор вопроса
Причина проблемы: при отправке почты из консоли, PHP использует один конфиг (/etc/php/7.0/cli/php.ini), а при вызовах mail() из php-файлов веб-сервера - другой (/etc/php/7.0/fpm/php.ini). В одном из конфигов правильное значение переменной sendmail_path (оно же дефолтное):
sendmail_path = "sendmail -t -i"
а в другом - неправильное: sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc -a default -t"
По этой причине почта из консоли отправлялась, а из php-файлов не отправлялась.
Решение проблемы в том, чтобы в /etc/php/7.0/fpm/php.ini было дефолтное значение для переменной sendmail_path, даже после установки msmtp.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vinoff
Возможно так будет проще отладить
sudo -u www-data php -r "mail('mymail@yandex.ru', 'Test Subject', 'Test Message');"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы