PHP → mail(), msmtp и Яндекс.Почта для домена
Переносил к себе на сервер один сайт и наткнулся на такую задачку, как отправка писем. Письма в движке этого сайта отправляются обычной функцией mail, а желания (да, в общем-то, и потребности) переписывать хоть одну строчку кода не было. Для отправки сообщений я давно уже использую сервис Яндекс.Почта для домена. Есть, конечно, куча других вариантов, но и этот отлично работает. Можно отправлять почту и своими силами, но имеется большая вероятность попасть в папку "спам" у получателей, необходимо настраивать разные штуки, вроде SPF и DKIM. В общем, было принято решение подружить mail и Яндекс.Почту
Для отправки задействуем транспорт SMTP, а отправлять будем простым клиентом msmtp. Устанавливается он двумя движениями пальцев, даже писать неохота, но напишу (для Debian или Ubuntu).
1 | sudo apt-get install msmtp
|
Следующим шагом создаём конфигурационный файл msmtp для работы с Яндекс.Почтой, разместить его можно где угодно, главное не забыть где он находится.
1 2 3 4 5 6 7 8 9 10 | account yandex
tls on
tls_certcheck off
auth on
host smtp.yandex.ru
port 587
user pupkin@example.org
from pupkin@example.org
password 11111111
logfile /path/to/msmtp.log
|
Порт 465 тут не работает, проверял. И если отправитель, который from, не совпадает с пользователем user, через которого логинимся, то письмо никуда не уходит.
Ещё важный момент - конфигурационный файл должен быть доступен на чтение и запись только для владельца, иначе письма отправляться не будут. Делаем это так:
1 2 3 4 5 | chmod 600 /path/to/config/msmtp
# такая строчка, потому что msmtp будет запускаться
# от пользователя сервера Apache2
chown www-data:www-data /path/to/config/msmtp
|
Далее нужно научить PHP работать с msmtp, а сделать это просто. Для этого необходимо установить в php.ini директиву sendmail_path. Поскольку у меня на сервере крутится несколько сайтов, то у себя я эту директиву определил в настройках виртуального хоста апача. А заодно, для надёжности, прописал отправителя в sendmail_from:
1 2 3 4 5 6 7 8 9 10 11 | <VirtualHost *:80>
ServerName example.org
php_admin_value sendmail_path "/usr/bin/msmtp -C /path/to/config/msmtp -a yandex -t"
php_admin_value sendmail_from "pupkin@example.org"
DocumentRoot "/path/to/httpdocs"
<Directory "/path/to/httpdocs">
...
</Directory>
</VirtualHost>
|
Готово :)
Комментарии
Когда я отсылаю через консоль, то там есть команда для msmtp -F"fullname".
Где я вместо фулнейм указываю, что хочу и получатель видит нужное мне имя.
Если же я не указываю эту опцию, то имя=почта отправителя.
Если же я пробую отправить через php, то получатель видит имя отправителя: root, то есть пользователя сервера.
И я не понимаю, где и как я могу это поправить.