Debian.pro

Блог для пользователей и администраторов Debian


Отправка почты с сервера для ленивых, 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-аккаунт.


Комментарии (9):

  1. Отличная утилита, сам держу ее на вооружении

  2. Настраивал exim для отправки через яндекс: http://www.zagirov.name/exim-pdd-yandex-ru

    Кто-нибудь замерял кто отправляет быстрей: ssmtp или exim?

  3. А тут замерять нечего — exim быстрее.

  4. Аnton :

    Чем она лучше msmtp?

  5. Примерно ничем.

  6. dhd :

    почему не написали как отправлять письмо

  7. > почему не написали как отправлять письмо
    «по сути является «заглушкой» для бинарника sendmail»

  8. Не могу нигде найти, может ли ssmtp делать sasl, так как яндекс теперь принимает запросы только по 465 порту. Прокомментируйте, пожалуйста.

  9. mailhub=mail.your.domain:465
    #UseTLS=YES

Написать комментарий