Настраиваем почтовые уведомления в Linux

2019-02-21

Довольно часто возникает необходимость настроить почтовые оповещения от системы (речь конечно же про Linux, если что). Это могут быть послания от cron, всяческих mdadm (мониторинг RAID), да и вообще при всём бурном развитии мессенджеров старый добрый пуленепробиваемый email ещё никто не отменял. Тем более, что большинство утилит (тот же cron) и умеют как раз-таки общаться именно через почту.
Полноценный почтовый сервер поднимать не имеет смысла, особенно, когда речь идёт про одноплатные компьютеры. Там дорог каждый байт, как и в RAM, так и на флешке.
Поэтому будем обходиться простым средством и сведём задачу к простой отправке писем на наш самый обычный email адрес.

Итак, дано:

  • Свежеустановленный Armbian (Debian stretch).
  • Почтовый адрес на Яндексе.

Не проверял на Ubuntu, но думаю будет всё тоже самое. И да, с gmail это тоже заработает. Важно, чтобы в настройках вашего почтового аккаунта на Яндекс/Gmail/whatever была разрешена отправка через SMTP.

Надо:

  • Уметь отсылать почту на произвольный почтовый адрес.
  • Всю почту адресованную root, вашему_пользователю и служебным аккаунтам (типа www-data) отсылать на некий внешний адрес.

Задача осложняется тем, что нельзя так просто взять и использовать первый попавшийся smtp сервер. Конечно, ваш провайдер может и разрешит отсылку, но устройство может быть подключено по альтернативному каналу.

А ведь я помню времена, когда все работало без всяких авторизаций. А потом появились интернет-маркетологи, нигерийские принцы и прочие пидорасы.

Так что будем пользоваться этим самым Яндексом, упомянутым выше.

Итак, поехали…

Первое, что нужно сделать — обеспечить функционирование команды mail в свежепоставленном Linux.
Две команды:

1
2
sudo apt-get install heirloom-mailx
sudo update-alternatives --install /usr/bin/mail mail /usr/bin/heirloom-mailx 1

Первая ставит старорежимный почтовый клиент (она будет эмулировать команду mail), вторая же делает “официальную запись о том, что в качестве команды mail мы будем использовать другой бинарник”. Нет, вопрос можно решить и симлинком, но это способ более каноничный.

Дальше можно набрать команду mail и получить гордый отлуп No mail for my_username.

Теперь нам нужно настроить почтовый транспорт, то есть обеспечить работу sendmail. Настройка каноничного sendmail — занятие требующее самоотречения, поэтому поставим его заменитель.

1
2
sudo apt-get install msmtp
sudo update-alternatives --install /usr/sbin/sendmail sendmail /usr/bin/msmtp 1

msmtp — небольшая утилита, которая умеет делать только одно — отсылать почту на сконфигурированный smtp сервер. К недостаткам можно отнести следующее — в моем случае она не делает никакую очередь. То есть в случае проблем с сетью письмо просто пропадет. В принципе, для “домашнего пользованя” очень даже подойдет.

Если же сохранность оповещений критична — используте другой транспорт, например exim4. Но это уже совсем другая история.

Дальше нужно отконфигурировать _msmtp. Шага три:

  • Создать папку для логов (я хз почему она не создается сама).
  • Создать конфигурационный файл
  • Настроить алиасы

Раз:

1
2
sudo mkdir /var/log/msmtp
sudo chmod 777 /var/log/msmtp

На самом деле chmod/owner должны быть более адекватные-другие. Но мне лениво искать, какие именно, поэтому пусть будет можно всё всем.

Два:

Предположим, наш аккаунт на Яндексе — zaloopa@yandex.ru.
Тогда файл /etc/msmtprc должен иметь следующее содержание:

1
2
3
4
5
6
7
8
9
10
11
12
13
defaults
account default
host smtp.yandex.ru
port 465
auth on
tls on
tls_starttls off
tls_certcheck off
user zaloopa
password ZalupaSecret
from zaloopa@yandex.ru
aliases /etc/mail_aliases
logfile /var/log/msmtp/msmtp.log

В случае использования Gmail нужно будет сменить то, что в поле host. Ну и возможно настройки tls, хотя вроде всё должно работать. Если используется “ПДД — почта для домена”, то вместо логина нужно писать полный адрес — zaloopa@zaloopa.info

Три:

Алиасы важны. Вот пример файла /etc/mail_aliases:

1
2
3
root: zaloopa@yandex.ru
my_username: zaloopa@yandex.ru
www-data: zaloopa@yandex.ru

Теперь вся почта для пользователей root,my_username и www-data будет уходить на внешний адрес.

Отлично. Проверить довольно просто — пишем три письма командой mail. Одно для root, второе для my_username, третье — для www-data. Если вы осилили работу с консольным почтовым клиентом и успешно написали их, то в логе msmtp будет примерно следующее:

1
Feb 20 10:45:09 host=smtp.yandex.ru tls=on auth=on user=zaloopa from=zaloopad@yandex.ru recipients=zaloopa@yandex.ru mailsize=144 smtpstatus=250 smtpmsg='250 2.0.0 Ok: queued on smtp4o.mail.yandex.net as 1550659509-c1eIJdfssfdgsgen-j9fgfQghhgX' exitcode=EX_OK

Письма благополучно приняты почтовым сервером и теперь их доставка на могучих плечах Яндекс или Google.

Ещё раз о приемуществах и недостатках такого setup.

Плюсы:

  • Он занимает мало места
  • Прост, понятен и прозрачен в конфигурации
  • Не висит никакой процесс в памяти

Минусы:

  • Нет очереди (письма потеряются при недоступности сервера)

У меня на подобной фигне вполне бодро работает гейтвей sms2email и приходят уведомительные письма от cron.

И да, для “разработчиков на ПоХаПэ” — это будет работать с функциями php_mail, или как там называется это ваше поделие. Короче, будет работать со всем, что умеет использовать sendmail в Linux. А это 99.9% случаев.


В массы

В трубу