====== Почта: настройка ssmtp ======
===== Что будем делать =====
ssmtp - SMTP-клиент (не MTA?). Когда некогда настраивать Exim/Postfix, но почту отправлять надо (postfix+Яндекс.ПДД совсем недолго, но сложно если ранее не делали).
Рассмотрим пример настройки для отправки писем с трёх разных сайтов через три разные почтовые службы. Перефразируя - условные три сайта работают одновременно и отправляют почту каждый со своего почтового домена.
Вымышленные пользователи и их email адреса
* Бэтмэн использует Gmail (batman@gmail.com)
* Пингвин использует Яндекс.ПДД (tux@linux.com)
* Джокер использует biz.mail.ru (joker@anekdot.ru)
===== Установка и настройка ssmtp =====
Устанавливаем SMTP клиент
# apt-get install ssmtp
Файл конфигурации ''/etc/ssmtp/ssmtp.conf'' оставляем без изменений.
Создаём новые конфигурационные файлы для каждой почтовой службы
# touch /etc/ssmtp/ssmtp-gmail.conf
# touch /etc/ssmtp/ssmtp-yandex.conf
# touch /etc/ssmtp/ssmtp-mailru.conf
В файл ''/etc/ssmtp/revaliases'' заранее добавляем
batman:batman@gmail.com:smtp.gmail.com:465
tux:tux@linux.com:smtp.yandex.ru:465
joker:joker@anekdot.ru:smtp.mail.ru:465
root:batman@gmail.com:smtp.gmail.com:465
www-data:batman@gmail.com:smtp.gmail.com:465
batman:batman@gmail.com:smtp.gmail.com:465
Почему root и другие пользователи?
Через консоль мы будем отправлять от имени root, а через php от имени системного пользователя (использую mod_ruid).
В тестовом окружении можно позволить себе работать под root'ом. Но если сервер не ваш или дико важный продакшн, тогда вы ССЗБ.
{{:linux:root_on_prod.jpg?nolink&350|}}
==== Конфигурационные файлы ssmtp ====
Файл **/etc/ssmtp/ssmtp-gmail.conf**
mailhub=smtp.gmail.com:465
AuthUser=batman@gmail.com
AuthPass=BWisthebest
AuthMethod=LOGIN
rewriteDomain=gmail.com
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes
Файл **/etc/ssmtp/ssmtp-yandex.conf**
mailhub=smtp.yandex.ru:465
AuthUser=tux@linux.com
AuthPass=nvidiasuxx
AuthMethod=LOGIN
rewriteDomain=linux.com
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes
Файл **/etc/ssmtp/ssmtp-mailru.conf**
mailhub=smtp.mail.ru:465
AuthUser=joker@anekdot.ru
AuthPass=waiting1april
AuthMethod=LOGIN
rewriteDomain=anekdot.ru
hostname=localhost
UseTLS=Yes
#UseSTARTTLS=Yes
TLS_CA_File=/etc/ssl/certs/ca-certificates.crt
FromLineOverride=Yes
#Debug=Yes
==== Проверка ====
Проверить отправку писем через консоль можно множеством способов.
Самый простой через pipe, добавляем здесь ключ ''-C'' для указания на конкретный конфигурационный файл ([[https://linux.die.net/man/8/ssmtp|подробнее в man]])
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-gmail.conf vvp@kermlin.su
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-yandex.conf vvp@kermlin.su
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-mailru.conf vvp@kermlin.su
Проверка через PHP
==== Наступлю на грабли за вас ====
**1** Для mail.ru и Yandex: перед отравкой почты необходимо зайти в почтовый ящик через веб-интерфейс. В противном случае будет ошибка
ssmtp: 550 Message was not accepted -- invalid mailbox. You need to complete your registration in order to send your mail. Please visit http://e.mail.ru/signup?NeedMoreInfo=1
**2** Ещё одна ошибка
RCPT TO: (501 sender address must match authenticated user)
В ''revaliases'' добавляем нужных пользователей. В моём случае php-скрипты запускаются от имени системного пользователя, а не от nobody или www-data/httpd, поэтому в revaliases помимо root указаны логины системных пользователей.
**3** Неверный From
Дальше я ещё сильнее расширил свои познания в Linux. Если у системного пользователя задан email, то именно он будет использоваться в поле From. Пример файла **/etc/passwd**
dx:x:1001:1001:username@gmail.com:/home/dx:/usr/sbin/nologin
**4** Если в логе FIXME
Creating SSL connection to host
SSL not working: certificate verify failed (20)
Cannot open smtp.gmail.com:587
то добавьте в конфигурационный файл опцию **TLS_CA_File**
Путь для Ubuntu/Debian /etc/ssl/certs/ca-certificates.crt
Путь для CentOS /etc/pki/tls/certs/ca-bundle.crt
==== Есть ли журнал/лог у ssmtp? ====
Да, для этого требуется добавить опцию **Debug=YES**. После чего в syslog будут записываться содержимое отправленных писем и почтовые заголовки.
Если не в syslog, то куда-нибудь уж точно. Найти поможет команда
# grep -riI ssmtp /var/log
==== Как указать сайту какой конфиг использовать ====
Наконец-то самое интересное
Через htaccess нельзя.
Если у каждого сайта свой php.ini, то
sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf"
Либо через конфигурацию виртуального хоста
Для Apache
...
...
php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf"
Для nginx/php-fpm
fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf";
===== Заключение =====
//Неразборчиво врачебным почерком// у ssmtp есть есть аналог - [[:linux/msmtp|msmtp]].