September 13, 2020

Отправка почты от Postfix через почтовый сервер Яндекса

В данной статье мы разберем ситуацию, при которой есть необходимость отправлять почту со своего сервера на Postfix, но через почту яндекса (использовать его в качестве smarthost). При этом, необходимо настроить возможность использования нескольких учетных записей. Инструкция подойдет под любой дистрибутив системы UNIX, на котором можно установить Postfix. Почтовая система Яндекса используется лишь для примера — по сути, по данному принципу можно настроить и пересылку почты через другие почтовые системы.

Требования

Нам необходимо иметь почтовые учетные записи в Яндексе. При отправке писем мы будем использовать правила аутентификации на серверах последнего с использованием данных учетных записей.

Настройка Postfix

Открываем конфигурационный файл postfix:

vi /etc/postfix/main.cf

Добавим следующие строки:

relayhost =
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/private/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_type = cyrus
smtp_sasl_mechanism_filter = login
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/private/sender_relay
smtp_tls_CAfile = /etc/postfix/ca.pem
smtp_use_tls = yes

* где:

  • relayhost — сервер, через который нужно отправлять почту. Мы будем использовать отдельные правила, поэтому оставляем данный параметр с пустым значением.
  • smtp_sasl_auth_enable — включение аутентификации на стороне клиента.
  • smtp_sasl_password_maps — указывает на файл, в котором хранится база связок логин/пароль.
  • smtp_sasl_security_options — опции SASL. noanonymous указывает на запрет анонимной аутентификации.
  • smtp_sasl_type — задает плагин SASL для аутентификации.
  • smtp_sasl_mechanism_filter — перечисляет механизмы проверки пользователя и пароля.
  • smtp_sender_dependent_authentication — включает зависящую от отправителя аутентификацию, отключает кэширование SMTP-соединения.
  • sender_dependent_relayhost_maps — указание на список адресов и почтовых серверов, через которые нужно отправлять письма на эти адреса.
  • smtp_tls_CAfile — файл с сертификатом Яндекса.
  • smtp_use_tls — указывает, использовать ли TLS для SMTP.

Создаем каталог для конфигов:

mkdir /etc/postfix/private

Создаем файл с правилами пересылки сообщений:

vi /etc/postfix/private/sender_relay

@yandex.ru smtp.yandex.ru

* в данном примере мы все сообщения, отправляемые от домена yandex.ru переправляем через сервер smtp.yandex.ru.

Создаем файл с настройкой привязки логинов и паролей:

vi /etc/postfix/private/sasl_passwd

[email protected] [email protected]:password1
[email protected] [email protected]:password2

* в данном примере мы создаем 2 учетные записи для аутентификации на яндексе. При отправке писем от [email protected] необходимо авторизоваться на сервере яндекса от этой же учетной записи с паролем password1. Соответственно, при отправке письма от [email protected] — с паролем password2.

Создаем карты для данных файлов:

postmap /etc/postfix/private/{sasl_passwd,sender_relay}

Получаем сертификат от Яндекса, для этого выполняем запрос:

openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25

... на экран будет выведена различная информация — нам нужна вся, что заключена между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----. Копируем ее и создаем файл сертификата:

vi /etc/postfix/ca.pem

-----BEGIN CERTIFICATE-----
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
...
nRG0DfdqYIuPGApFORYe
-----END CERTIFICATE-----

Перезапускаем Postfix:

systemctl restart postfix

Обратите внимание на 2 момента:
1) так как яндекс может обслуживать почту для любых доменов, не обязательно должен использоваться домен yandex.ru.
2) отправка сообщения должна идти строго от того пользователя, под которым идет авторизация на yandex. В противном случае, подключение не пройдет проверку и завершится ошибкой.

Проверка

Для проверки можно использовать консольную команду mail.

Если используем Red Hat / CentOS

yum install mailx

После отправляем письмо

echo "Test text" | mail -s "Test title" -r [email protected] [email protected]

* в данном примере мы отправляем письмо от почты root@yandex.ru на ящик [email protected].

Если используем Ubuntu / Debian

apt-get install mailutils

После можно отправлять письмо:

echo "Test text" | mail -s "Test title" [email protected] -aFrom:[email protected]

* в данном примере мы отправляем письмо от ящика [email protected] на почту [email protected].

Результат

В итоге на отправляемый ящик электронной почты должно прийти письмо от нашего адреса с доменом yandex.ru. Если посмотреть в заголовки, оно должно было быть отправлено через серверы Яндекса: