PHP → mail(), msmtp и Яндекс.Почта для домена
Переносил к себе на сервер один сайт и наткнулся на такую задачку, как отправка писем. Письма в движке этого сайта отправляются обычной функцией mail, а желания (да, в общем-то, и потребности) переписывать хоть одну строчку кода не было. Для отправки сообщений я давно уже использую сервис Яндекс.Почта для домена. Есть, конечно, куча других вариантов, но и этот отлично работает. Можно отправлять почту и своими силами, но имеется большая вероятность попасть в папку "спам" у получателей, необходимо настраивать разные штуки, вроде SPF и DKIM. В общем, было принято решение подружить mail и Яндекс.Почту
Для отправки задействуем транспорт SMTP, а отправлять будем простым клиентом msmtp. Устанавливается он двумя движениями пальцев, даже писать неохота, но напишу (для Debian или Ubuntu).
sudo apt-get install msmtp
Следующим шагом создаём конфигурационный файл msmtp для работы с Яндекс.Почтой, разместить его можно где угодно, главное не забыть где он находится.
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, через которого логинимся, то письмо никуда не уходит.
Ещё важный момент - конфигурационный файл должен быть доступен на чтение и запись только для владельца, иначе письма отправляться не будут. Делаем это так:
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:
<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, то есть пользователя сервера.
И я не понимаю, где и как я могу это поправить.
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Веб-сайт вводите в формате http://example.org, при желании, конечно.