Отправка почты с сервера для ленивых, ssmtp

Частенько возникает необходимость слать почту с сервера (скриптами сайта). Ещё чаще — настраивать почтовый сервер хотя бы даже так лениво.
В такие моменты на помощь приходят утилитки вроде ssmtp. Утилита по сути является «заглушкой» для бинарника sendmail, которая позволяет слать почту через relay-сервер или через обычный smtp-аккаунт на стороннем сервере.

Сразу о минусах. SSMTP работает медленно. 2 секунды на 1 письмо для него — хороший результат. Обычно, на большое html письмо уходит 3-6 секунд. Используйте аккуратно в синхронных операциях.
Я переписывал код ssmtp так, чтобы он работал намного быстрее (~0.2с на письмо), но в таком случае письма начинали теряться. Так что не советую делать этого =)

В общем-то, это вроде всё важное. Сама утилитка прекрасная и система не заметит разницу между, например, локально установленным exim и ssmtp, который шлет в удаленный smtp-сервер/relay. Конечно, она не работает как настоящий smtp-сервер — не открывает сокет на 25м порту, не позволяет отправлять письма телнетом. Но командам mail (из пакета mailx) и apache этого не требуется.

Устанавливается как обычно:
root@server:~# apt-get install ssmtp


Попросит снести все другие заглушки для sendmail. Нужно понимать, что таки заглушки обычно входят в состав MTA, поэтому MTA снесутся тоже (postfix, exim, etc).

Теперь переходим к редактированию конфига. Для начала почистим его (сначала можете почитать, но мои примеры сойдут за целый конфиг):
root@server:~# echo > /etc/ssmtp/ssmtp.conf


Теперь напишем конфиг для первого примера — отправки писем с сервера через сторонний smtp-аккаунт. Для примера — аккаунт на яндексе. В моём случае это будет ящик dev@debian.pro для машинки dev.debian.pro.

# Указываем smtp-сервер, через который будем отправлять письма.
mailhub=smtp.yandex.ru

# Указываем имя пользователя на smtp-сервере. Для ПДД - ящик целиком.
AuthUser=dev@debian.pro

# Указываем пароль от smtp-аккаунта:
AuthPass=your_password

# Выставляем принудительное переписывание домена в поле From:. В противном случае, наше письмо не будет отправлено сторонним smtp-сервером:
rewriteDomain=debian.pro

# Hostname нашего тазика. Очень желательно, чтобы hostname совпадал c PTR записью IP адреса, с которого будем устанавливать соединения, но не обязательно.
hostname=dev.debian.pro

# запрещаем скриптам "решать", с какого ящика они отправляют письмо. Поле From: будет выставляться самим smtp. Точнее, скрипты будут выставлять своё значение, но ssmtp будет его переписывать.
FromLineOverride=NO

# указываем ящик, куда будет отправляться вся локальная почта предназначенная пользователям с uid < 1000. В том числе, root (письма от крона), www-data и так далее.
Root=root@debian.pro



Ну и дальше готовим файл /etc/ssmtp/revaliases, при помощи которого мы сообщим ssmtp, что к почте определенных локальных пользователей нужно принудительно выставлять заголовок From:

# локальный_пользователь:ящик[:сервер_с_которого_слать]
root:dev@debian.pro
www-data:dev@debian.pro
inky:dev@debian.pro



Пользователям, не указанным в этом файле, отправить почту с сервера не получится (smtp-сервер даст им отлуп, дескать «вы не можете слать с ящика xxx@debian.pro»).
Но при этом, в случае с ПДД яндекса у вас есть адский чит. Можно пойти в настройки ящика на pdd.yandex.ru (в моем случае — dev@debian.pro) и добавить ему алиасом ящик inky@debian.pro. Тогда локальный пользователь inky сможет слать почту как inky@debian.pro с теми же учетными данными.
А можно поступить ещё круче и добавить домен-алиас. И к ящику dev@debian.pro добавить алиас me@vlad.pro. И сделать в файле revaliases такую конструкцию:

# локальный_пользователь:ящик[:сервер_с_которого_слать]
root:dev@debian.pro
www-data:dev@debian.pro
inky:me@vlad.pro:smtp.yandex.ru



Правда, для этого придется закомментировать строку rewriteDomain=debian.pro и ручками следить за тем, что почта отправляется с «правильного» домена.
В общем, правильно поигравшись с алиасами можно добиться вполне себе «фирменных» почтовых ящиков для большого количества сайтов через один smtp-аккаунт.

Комментарии

Популярные сообщения из этого блога

Права на папки и файлы (unix/chmod)

Автоматическое монтирование дисков и разделов в Linux или что такое fstab? Проблема Debian

Как подключить сетевой диск Windows в Linux