RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:ssmtp

Почта: настройка ssmtp

Что будем делать

ssmtp - SMTP-клиент (не MTA?). Когда некогда настраивать Exim/Postfix, но почту отправлять надо (postfix+Яндекс.ПДД совсем недолго, но сложно если ранее не делали).

Рассмотрим пример настройки для отправки писем с трёх разных сайтов через три разные почтовые службы. Перефразируя - условные три сайта работают одновременно и отправляют почту каждый со своего почтового домена.

Вымышленные пользователи и их email адреса

Установка и настройка 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:[email protected]:smtp.gmail.com:465
tux:[email protected]:smtp.yandex.ru:465
joker:[email protected]:smtp.mail.ru:465
root:[email protected]:smtp.gmail.com:465
www-data:[email protected]:smtp.gmail.com:465
batman:[email protected]:smtp.gmail.com:465

Почему root и другие пользователи?

Через консоль мы будем отправлять от имени root, а через php от имени системного пользователя (использую mod_ruid).

В тестовом окружении можно позволить себе работать под root'ом. Но если сервер не ваш или дико важный продакшн, тогда вы ССЗБ.

Конфигурационные файлы ssmtp

Файл /etc/ssmtp/ssmtp-gmail.conf

mailhub=smtp.gmail.com:465
[email protected]
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
[email protected]
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
[email protected]
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 для указания на конкретный конфигурационный файл (подробнее в man)

echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-gmail.conf  [email protected]
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-yandex.conf [email protected]
echo "Test text" | ssmtp -C/etc/ssmtp/ssmtp-mailru.conf [email protected]

Проверка через PHP

<?php
mail('[email protected]', 'Пенсионная реформа', 'Смерть ворогам!');
?>

Наступлю на грабли за вас

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:<[email protected]> (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:[email protected]:/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

<VirtualHost 1.3.3.7:80>
 ...
    <Directory /home/user/domain.tld/public_html>
        ...
        php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf"
    </Directory>
</VirtualHost>

Для nginx/php-fpm

fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-gmail.conf";

Заключение

Неразборчиво врачебным почерком у ssmtp есть есть аналог - msmtp.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/ssmtp.txt · Последнее изменение: 2018/07/03 13:51 — 127.0.0.1