Настройка Postfix через Yandex relay

Сейчас, во времена новомодных devops-инструментов, отправки сообщений в Slack или Telegram одной строчкой в скрипте и так далее, электронная почта кажется ненужным атавизмом.
И всё-таки возникают случаи, когда с linux-машины нужно отправить сообщение. И, желательно, через какой-нибудь доверенный relay типа Google или Yandex.
Почему? Потому что иначе отправленное вами письмо или попадёт в спам, или вовсе не дойдёт до адресата.
Не буду останавливаться на настройке DKIM/SPF – тут всё, во-первых, будет зависеть от того, используете ли вы ПДД (почта для домена), а во-вторых, если вы знаете, что это такое и зачем нужно, то разберётесь и без меня (ну или погуглите ;))

Итак, рассмотрим простую ситуацию. У нас есть аккаунт в Yandex (у меня это Yandex.PDD). Мы хотим отправлять почту с linux-машины (ubuntu 18.04) через SMTP Relay с авторизацией.
Делать мы это будем при помощи postfix.

1. Ставим нужное

Поехали:
[cc lang=”bash”]apt install postfix mailutils libsasl2-2 sasl2-bin libsasl2-modules[/cc]

2. Правим конфиги

cat /etc/mailname
[cc]server.example.com[/cc]
cat /etc/hostname
[cc]server.example.com[/cc]

cat /etc/postfix/main.cf
[cc lang=”bash”]
myorigin = /etc/mailname
ЕСЛИ почтовый домен совпадает с hostname сервера, меняем параметр mydestination
mydestination = localhost.$mydomain, localhost
Если этого не сделать, сервер не сможет слать письма в свой домен, т.к. будет искать адресатов в таблице локальных пользователей — разумеется безуспешно.
[/cc]
Часть настроек я опустил, оставил только то, что изменится по сравнению с дефолтной конфигурацией.

В этом файлике мы будем настраивать маппинг внутренних адресов
Подробное описание тут:
cat /etc/postfix/generic
[cc]
root robot@example.com
mailer-daemon robot@example.com
@localhost robot@example.com
@localhost robot@example.com
@example.com robot@example.com
@localhost.localdomain robot@example.com
[/cc]

Настраиваем rewrite адресов отправителей.
Вместо домена можно указать конкретный адрес
Подробное описание тут:
cat /etc/postfix/sender_canonical_maps
[cc]@example.com robot@example.com[/cc]

Тут мы говорим, для каких доменов (или адресантов) мы будем использовать релей
cat /etc/postfix/sender_relay
[cc]@example.com [smtp.yandex.ru][/cc]

А в этом файле, указываем, собственно, smtp-сервер и параметры аутентификации.
cat /etc/postfix/sasl_passwd
[cc][smtp.yandex.ru]:587 robot@example.com:password[/cc]

Т.к. взаимодействие с сервером идёт по TLS, не помешает скачать сертификат SMTP-сервера.
Добыть сертификат можно вот так:
[cc lang=”bash”]openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25[/cc]

Из вывода нам нужно что-то вроде такого:
[cc]—–BEGIN CERTIFICATE—–
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
MQswCQYDVQQGEwJSVTETMBEGA1UEChMKWWFuZGV4IExMQzEnMCUGA1UECxMeWWFu
ZGV4IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRIwEAYDVQQDEwlZYW5kZXggQ0Ew
HhcNMTcxMDExMTMyNzI2WhcNMTkxMDExMTMyNzI2WjB3MQswCQYDVQQGEwJSVTET
MBEGA1UECgwKWWFuZGV4IExMQzEMMAoGA1UECwwDSVRPMQ8wDQYDVQQHDAZNb3Nj
b3cxGzAZBgNVBAgMElJ1c3NpYW4gRmVkZXJhdGlvbjEXMBUGA1UEAwwOc210cC55
YW5kZXgucnUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCTI5WsplxQ
g7gZDCEmnbxHI0a0/cXtx0+Zwz7Y9TSFy0NI/SzYC+bgukWvsnvuIheM3yKpJ+cU
Ss2G+K3nKOYDNJUezzziirhu3UVC/tZLD39orKKGAa6qmx5Dv2Z7/ynkOfKZjmXB
t9HemoCItyM62YTD8AQQmkMCB4Kue+j2wm8fHxPtgIYuQzEtD9xCU9vANj6imgaM
IlrM0cegknd6sWBDR074pDsBEUjg2GsNSqAo2nD0tvOGCFZ2qkIMLIjZgsCmtain
nM7Xt+THw8ApMu9BVsgTyXMTfVC0CzfB1HbId1UzqIbILprB3iLrxCHn3K1F68ok
WfBXBDY4gphTAgMBAAGjggMJMIIDBTAMBgNVHRMBAf8EAjAAMGkGA1UdHwRiMGAw
L6AtoCuGKWh0dHA6Ly9jcmxzLnlhbmRleC5uZXQvY2VydHVtL3ljYXNoYTIuY3Js
MC2gK6AphidodHRwOi8veWFuZGV4LmNybC5jZXJ0dW0ucGwveWNhc2hhMi5jcmww
cQYIKwYBBQUHAQEEZTBjMCwGCCsGAQUFBzABhiBodHRwOi8veWFuZGV4Lm9jc3At
cmVzcG9uZGVyLmNvbTAzBggrBgEFBQcwAoYnaHR0cDovL3JlcG9zaXRvcnkuY2Vy
dHVtLnBsL3ljYXNoYTIuY2VyMB8GA1UdIwQYMBaAFDdc4xngso6hqE7Sz6vQ3OML
XDVNMB0GA1UdDgQWBBTC1Kbatmr8y04cui/VCaPVq1mgKzAOBgNVHQ8BAf8EBAMC
BaAwggEXBgNVHSAEggEOMIIBCjCCAQYGDCqEaAGG9ncCBQEKAjCB9TCB8gYIKwYB
BQUHAgIwgeUwIBYZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjADAgECGoHAVXNh
Z2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdHJpY3RseSBzdWJqZWN0ZWQgdG8g
dGhlIENFUlRVTSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudCAoQ1BT
KSBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlIGhlcmVpbiBhbmQgaW4gdGhlIHJl
cG9zaXRvcnkgYXQgaHR0cHM6Ly93d3cuY2VydHVtLnBsL3JlcG9zaXRvcnkuMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjARBglghkgBhvhCAQEEBAMCBsAw
egYDVR0RBHMwcYIOc210cC55YW5kZXgucnWCDnNtdHAueWFuZGV4LmJ5gg5zbXRw
LnlhbmRleC5reoIPc210cC55YW5kZXguY29tgg5zbXRwLnlhbmRleC51YYISc210
cC55YW5kZXguY29tLnRyggpzbXRwLnlhLnJ1MA0GCSqGSIb3DQEBCwUAA4IBAQA1
GjyKSYMgaRVLGd4EWtB3oTkybDu5QrUXt/eoZiquzUqZwk7x9FRsEEirawKsrSS6
FXcliRD7xcXneROVDZK1a4ur6974vn742B/lOx9T/7+6a8XQo4jz191zZWS3J47G
dSvkMZPSdsZPxn7cDbAymFP4yw3b/aJJBFarpYTUixvRXZardO93VAFx157pCt/8
3dN7jLWyYVWBvZh93JioukAu9uDt7Nzuq9XhTBLUzLnFFi4vXVsssKk7h3X2sMNU
kZ3EPMAOSsvl9XY5RHZJs7BZubvGgnDxxGFfziP1XnTbL4MRCAXbdhwx3nmnQ3yZ
nRG0DfdqYIuPGApFORYe
—–END CERTIFICATE—–[/cc]

..и сохранить в файл (в моём случае /etc/postfix/yandex.crt).

3. Проверяем

Комилируем конфигурацию для postfix:
[cc]
postmap /etc/postfix/canonical
postmap /etc/postfix/generic
postmap /etc/postfix/sasl_passwd
postmap /etc/postfix/sender_relay
[/cc]

И рестартуем сервис
[cc]service postfix restart[/cc]

Отправку почты проверяем так (возможно, потребуется поставить mailx):
[cc]echo ‘Hello, world!’ | mail -s ‘Test of Yandex relay’ root@example.com[/cc]

Если всё ок, то будет так (смотреть можно так: `sudo tail -F /var/log/mail.log`):
[cc]
May 5 01:10:38 server postfix/qmgr[18264]: 6F57B7D92E: from=, size=365, nrcpt=1 (queue active)
May 5 01:10:39 server postfix/smtp[18274]: 6F57B7D92E: to=, relay=smtp.yandex.ru[213.180.204.38]:25, delay=1.3, delays=0.01/0/0.49/0.8, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued on smtp4j.mail.yandex.net as 1557007839-eNWMy4YFLq-AcPCKVEh)
[/cc]

А если не ок, то вот так:
[cc]
May 5 01:05:36 vpn01 postfix/qmgr[18014]: 6B2567D92E: from=, size=386, nrcpt=1 (queue active)
May 5 01:05:36 vpn01 postfix/smtp[18024]: 6B2567D92E: to=, relay=smtp.yandex.ru[213.180.204.38]:25, delay=0.49, delays=0.01/0/0.42/0.05, dsn=5.5.4, status=bounced (host smtp.yandex.ru[213.180.204.38] said: 503 5.5.4 Error: send AUTH command first. (in reply to MAIL FROM command))
[/cc]
Я, в своё время, долго бился с этой ошибкой (потому что часть почты таки ходила нормально, а часть отбрасывалась сервером), даже переписывался с поддержкой Яндекса на этот счёт. Ничего вразумительного мне, конечно же, не ответили. Помогла тотальная ревизия конфигурации. Так что проверьте внимательно – возможно, что-то где-то вы написали не так, как надо

Или вот так:
[cc]May 5 00:33:43 vpn01 postfix/qmgr[14714]: 2B1877D92F: from=<>, size=2359, nrcpt=1 (queue active)
May 5 00:33:43 vpn01 postfix/smtp[14724]: 2B1877D92F: to=, relay=smtp.yandex.ru[93.158.134.38]:587, delay=0.55, delays=0.01/0/0.49/0.05, dsn=5.7.1, status=bounced (host smtp.yandex.ru[93.158.134.38] said: 553 5.7.1 Sender address rejected: not owned by auth user. (in reply to MAIL FROM command))
[/cc]
Такая ошибка возникает, если в поле from указан не тот адрес, с которым вы логинитесь в почту.
Возможны и другие ошибки, но при корректной конфигурации мне они не попадались.

P.S. Я советую использовать ansible для раскатывания ПО на ваши машины, и хранить YAML-описание ваших хостов в Git. Такой подход не только экономит время при раскатывании новой машины (или переустановке старой), но и позволяет хранить всю конфигурацию ваших хостов в одном месте – наглядно и просто.

Leave a Reply