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>

Готово :)

Комментарии

avatar
trommo
avatar
Дошло ли до тебя сообщение об этом комментарии? Мне кажется, что мы говорим о разных вещах...
ответить
avatar
morontt
avatar
Да, есть письмо. И на почту пришло, и в телеграм :)
ответить
avatar
usergaf
avatar
Такой вопрос.
Когда я отсылаю через консоль, то там есть команда для msmtp -F"fullname".
Где я вместо фулнейм указываю, что хочу и получатель видит нужное мне имя.
Если же я не указываю эту опцию, то имя=почта отправителя.
Если же я пробую отправить через php, то получатель видит имя отправителя: root, то есть пользователя сервера.

И я не понимаю, где и как я могу это поправить.
ответить
avatar
morontt
avatar
А через php это как? Есть же разные функции и библиотеки для отправки почты.
ответить
4 комментария Написать что-нибудь
Или войдите, чтобы не заполнять форму:
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Напрограммировано на Go 1.23.2, версия движка 589441d