Содержание
Почта: настройка ssmtp
Что будем делать
ssmtp - SMTP-клиент (не MTA?). Когда некогда настраивать Exim/Postfix, но почту отправлять надо (postfix+Яндекс.ПДД совсем недолго, но сложно если ранее не делали).
Рассмотрим пример настройки для отправки писем с трёх разных сайтов через три разные почтовые службы. Перефразируя - условные три сайта работают одновременно и отправляют почту каждый со своего почтового домена.
Вымышленные пользователи и их email адреса
- Бэтмэн использует Gmail ([email protected])
- Пингвин использует Яндекс.ПДД ([email protected])
- Джокер использует biz.mail.ru ([email protected])
Установка и настройка 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 Если в логе
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.
Обсуждение