Отправка почты из Fedora

В статье приводится алгоритм настройки утилиты msmtp. Это позволит отправлять почту как из консоли, так и из виртуальных хостов (полезно при разработке сайтов). С большой долей вероятности данные советы будут работать и на других современных ОС семейства Linux (благодаря повсеместному внедрению systemd).
Устанавливаем msmtp:

sudo dnf install msmtp

В настройке мне помогла статья «How to use MSMTP with Gmail, Yahoo and PHP Mail».
Правим персональный конфиг (~/.msmtprc), указываем настройки своего почтового ящика (с которого будут отправляться письма). На примере yandex почты записываем в файл (это и есть самая ценная информация статьи):

account default
logfile /var/log/msmtp.log
host smtp.yandex.ru
port 587
from mymail@yandex.ru
keepbcc on
auth on
user mymail@yandex.ru
password mypass
tls on
tls_starttls on
tls_certcheck off

Меняем права на конфиг (иначе персональные данные доступны другим пользователям и программа откажется работать):

chmod 600 ~/.msmtprc

Создаём файл для лога:

sudo touch /var/log/msmtp.log

Я изменил права на лог, чтобы мой web-сервер в дальнейшем также смог сюда писать лог отправки почты (мой пользователь находится в группе apache):

sudo chown apache:apache /var/log/msmtp.log

И права:

chmod 660 /var/log/msmtp.log

Для проверки создаём файл письма для отправки (~/demo_email) с содержимым:

From: Oleg <emailfrom@yandex.ru>
To: Oleg <emailto@mail.ru>
Subject: Hello World
Email sent using MSMTP

И пробуем отправить:

cat ~/demo_email | msmtp emailto@mail.ru

Результат: в консоли ничего не видно, а в логах отметка об отправке и письмо должно прийти на указанный адрес.
Всё, теперь можно слать письма из консоли!
Можно пойти дальше и научить отправлять письма локальный web-сервер. Для начала скопируем настройки локального пользователя в системные настройки:

sudo cp -p ~/.msmtprc /etc/msmtprc

Я сменил пользователя и группу так:

sudo chown apache:oleg /etc/msmtprc

И права (иначе не работает):

chmod 600 /etc/msmtprc

Открываем для редактирования файл /etc/php.ini (я это делаю через mc, запущенный через sudo) и находим секцию «[mail function]». Указываем новые данные почтовой программы:

sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc -r"

Перезапускаем Apache:

sudo systemctl restart httpd.service

После того, как я перешёл с Apache на Nginx + PHP-FPM, конфиг php.ini я почему-то изменил (уже не помню, по какой причине). Теперь у меня такая запись в php.ini:

sendmail_path = "/usr/bin/msmtp -t -i"

Перезапуск PHP-FPM:

sudo systemctl restart php-fpm.service

Теперь можно создать тестовый скрипт отправки почты (~/test_mail.php):

<?
if (mail("mailto@mail.ru","test subject", "test body","From: mailfrom@yandex.ru")) {
    echo "Сообщение передано функции mail, проверьте почту в ящике.";
} else {
    echo "Функция mail не работает, свяжитесь с администрацией хостинга.";
}

Пробуем запускать из консоли:

php ~/test_mail.php

По ответу будет понятно, всё ли правильно работает.

Автор: Олег Ехлаков