В предыдущих занятиях мы рассмотрели, как быстро установить полноценный почтовый сервер с использованием iRedMail или Modoboa, а также научились настраивать SMTP-релей с Postfix для обхода блокировок порта 25 и черных списков IP. Однако вам может не понадобиться настраивать весь почтовый сервер для работы с релей-хостом. Мы можем организовать Postfix transport map и relay map так, чтобы некоторые сообщения отправлялись через релей-хост, а другие — напрямую получателям.
Существует большое количество SMTP релеев. В данном уроке я продемонстрирую работу с Sendinblue, который предоставляет возможность отправлять до 9000 писем в месяц совершенно бесплатно. Эти сервисы поддерживают высокую репутацию IP-адресов. Они блокируют ненадежных отправителей и способствуют росту качественных, что увеличивает вероятность попадания ваших писем во входящие.

Содержание статьи
Как применять транспортную карту Postfix?
Транспортная карта устанавливает соответствия между адресом получателя и способом доставки. Значение параметра transport_maps в Postfix по умолчанию не задано, что можно проверить с помощью:
postconf transport_maps
transport_maps =
iRedMail и Modoboa применяют базы данных MySQL/MariaDB для сохранения транспортных карт. Если вы настраивали почтовый сервер с помощью iRedMail, то результат должен выглядеть следующим образом:
transport_maps = proxy:mysql:/etc/postfix/mysql/transport_maps_user.cf proxy:mysql:/etc/postfix/mysql/transport_maps_domain.cf
Если вы применили Modoboa для конфигурации почтового сервера, то результат должен выглядеть следующим образом:
transport_maps = proxy:mysql:/etc/postfix/sql-transport.cf proxy:mysql:/etc/postfix/sql-spliteddomains-transport.cf
Параметр transport_maps обозначает одну или несколько таблиц для поиска транспортных маршрутов. Вы можете внести изменения в главный конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
Чтобы задать значение, добавьте следующую строку в конец файла. Файл /etc/postfix/transport будет представлять собой таблицу для поиска.
transport_maps = hash:/etc/postfix/transport
При использовании iRedMail вы можете обнаружить параметр transport_maps и задать его значение следующим образом:
transport_maps = hash:/etc/postfix/transport proxy:mysql:/etc/postfix/mysql/transport_maps_user.cf proxy:mysql:/etc/postfix/mysql/transport_maps_domain.cf
Если вы работаете с Modoboa, вам следует обратить внимание на параметр transport_maps и задать ему следующее значение:
transport_maps = hash:/etc/postfix/transport proxy:mysql:/etc/postfix/sql-transport.cf proxy:mysql:/etc/postfix/sql-spliteddomains-transport.cf
Таблица поиска может представлять собой файл или таблицы из баз данных MySQL/MariaDB. Процесс поиска в таблицах будет осуществляться по установленному порядку до тех пор, пока не будет обнаружено соответствие.
Сохраните и завершите редактирование главного файла конфигурации Postfix. Затем необходимо создать файл для таблицы поиска.
sudo nano /etc/postfix/transport
В данном файле можно установить соответствия между адресами получателей и методами доставки. К примеру, я заметил, что многие домены. pl (Польша) применяют определённый черный список, который блокирует IP-адрес моего почтового сервера. Я могу внести следующую строку в этот файл, чтобы письма, направленные на домены. pl, отправлялись через Sendinblue.
.pl relay:[smtp-relay. sendinblue.com]:587
Многие считают, что отправить письмо на адреса Microsoft (hotmail.com, outlook.com и прочие) бывает сложно. Существует высокая вероятность, что ваше сообщение окажется в папке спама. Попробуйте воспользоваться Sendinblue для доставки писем пользователям этих почтовых сервисов. Эта платформа также предоставляет информацию о том, открыл ли получатель ваше письмо или нажал на ссылки внутри него. Поэтому я добавил следующие строки в файл.
/.*@hotmail.*/i relay:[smtp-relay. sendinblue.com]:587 /.*@outlook.*/i relay:[smtp-relay. sendinblue.com]:587 /.*@live.*/i relay:[smtp-relay. sendinblue.com]:587 /.*@msn.*/i relay:[smtp-relay. sendinblue.com]:587
Если вам необходимо использовать relay-хост для отправки писем определенному адресату, а для остальных получателей в том же домене отправлять сообщения напрямую, добавьте следующую строку.
[email protected] relay:[smtp-relay. sendinblue.com]:587
Если конкретный SMTP-сервер не функционирует на стандартном порту 25, а применяет альтернативный порт, например 2525, для обработки входящих сообщений, можно добавить такую строку:
example.com smtp:[mail.example.com]:2525
Рекомендуется включить ваше персональное доменное имя в данный файл, как это показано ниже.
your-domain.com local
Это сигнализирует Postfix о том, что сообщения, адресованные вашему домену, должны обрабатываться локально. Такое поведение является стандартным для канонических доменов. Если на вашем почтовом сервере настроено несколько виртуальных доменов, необходимо включить все из них.
your-domain1.com local your-domain2.com local
Добавив всего две строки в файл и не внося никаких других изменений, вы обеспечите, что все письма, кроме тех, что отправляются на ваш собственный домен, будут перенаправляться через relay host. Знак звёздочки (*) служит символом подстановки для любого адреса электронной почты.
your-domain.com local * relay:[smtp-relay. sendinblue.com]:587
Можно применить следующую настройку, при которой письма, адресованные вашему собственному домену, будут доставляться локально. Письма, направленные на gmail.com, обрабатываются стандартным образом с помощью MX lookup, а все остальные сообщения перенаправляются через relay host.
your-domain.com local gmail.com smtp * relay:[smtp-relay. sendinblue.com]:587
Сохраните файл и закройте его. После этого введите следующую команду для генерации индексного файла.
sudo postmap /etc/postfix/transport
Перезапустите Postfix, чтобы новые настройки начали действовать.
sudo systemctl restart postfix
Зависимость от отправителя в Relay Maps.
Карта транспортировки задает связь между адресом получателя и способом доставки. Если необходимо установить соответствие между адресом отправителя и relay host, воспользуйтесь параметром sender_dependent_relay_maps. По умолчанию он не содержит значений, что можно проверить с помощью команды:
postconf sender_dependent_relayhost_maps
sender_dependent_relayhost_maps =
iRedMail применяет базу данных MySQL/MariaDB для хранения карт relayhost, зависящих от отправителя. Если вы настраивали почтовый сервер с помощью iRedMail, результат будет выглядеть следующим образом:
sender_dependent_relayhost_maps = proxy:mysql:/etc/postfix/mysql/sender_dependent_relayhost_maps.cf
Параметр sender_dependent_relayhost_maps задаёт одну или несколько таблиц для поиска. Вы можете внести изменения в основной конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
Добавьте следующую строку в конец файла для установки значения. Файл /etc/postfix/relay_by_sender будет служить таблицей для поиска.
sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender
При использовании iRedMail вы можете обнаружить параметр sender_dependent_relayhost_maps и задать его значение следующим образом:
sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender proxy:mysql:/etc/postfix/mysql/sender_dependent_relayhost_maps.cf
Таблица для поиска может представлять собой файл или таблицу в базе данных MySQL/MariaDB. Эти таблицы будут проверяться в заданной последовательности, пока не будет обнаружено совпадение.
Сохраните и закройте главный конфигурационный файл Postfix. Затем необходимо создать файл для таблицы поиска.
sudo nano /etc/postfix/relay_by_sender
Добавьте следующие правила, чтобы письма, отправленные с [email protected], проходили через указанный справа relay host.
[email protected] [smtp-relay. sendinblue.com]:587
Предположим, у вас есть сервер на Linux, на котором размещены два веб-сайта, и для каждого сайта настроен свой почтовый сервер, работающий на отдельных хостах. В этом случае можно добавить две строки, чтобы каждый сайт использовал свой почтовый сервер.
@domain1.com [mail.domain1.com]:587 @domain2.com [mail.domain2.com]:587
Закройте и сохраните файл, после этого создайте файл индекса.
sudo postmap /etc/postfix/relay_by_sender
Перезапустите Postfix, чтобы новые настройки начали действовать.
sudo systemctl restart postfix
Настройка SMTP-аутентификации
Теперь необходимо настроить SMTP-аутентификацию, чтобы клиент Postfix мог использовать relay-хост. Внесите изменения в основной конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
В конец данного файла необходимо добавить следующие строки. Файл /etc/postfix/sasl_password будет включать логин и пароль.
# outbound relay configurations smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may header_size_limit = 4096000
Рекомендую задать для параметра relayhost пустое значение, как указано ниже, поскольку теперь используются transport maps и sender dependent relayhost maps.
relayhost =
Закройте и сохраните файл, после чего создайте файл по адресу /etc/postfix/sasl_passwd.
sudo nano /etc/postfix/sasl_passwd
Укажите хост SMTP-релея и данные для авторизации в этот файл, как показано в примере ниже. Вместо smtp_username и smtp_password используйте ваш логин и пароль, предоставленные сервисом SendinBlue. Учтите, что логин и пароль разделяются двоеточием.
[smtp-relay. sendinblue.com]:587 smtp_username:smtp_password
Сохраните файл и закройте его. После этого создайте соответствующий хеш-файл db, используя команду postmap.
sudo postmap /etc/postfix/sasl_passwd
Теперь у вас должен быть создан файл /etc/postfix/sasl_passwd. db. Перезапустите Postfix для применения изменений.
sudo systemctl restart postfix
Файлы sasl_passwd и sasl_passwd. db по умолчанию доступны для чтения любому пользователю на сервере. Установите права доступа на 600, чтобы только пользователь root имел возможность читать и изменять эти файлы.
sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd. db
Тестирование
Теперь у вас есть возможность отправить тестовое сообщение адресатам, указанным в транспортных картах, или отправить его с адреса, который прописан в sender dependent relayhost maps. После этого проверьте почтовый журнал (/var/log/mail.log или /var/log/maillog), чтобы убедиться, что всё функционирует корректно.
Имейте в виду, что при использовании стороннего SMTP-релей сервиса, например, Sendinblue, вам, скорее всего, потребуется подтвердить доменное имя в вашей учетной записи и внести изменения в записи SPF и DKIM.
Диагностика проблем
Ошибка номер один.
Если ваше сообщение не было отправлено, и вы увидели данное уведомление в журнале почты (/var/log/maillog),
Relay access denied (in reply to RCPT TO command))
Возможно, вам потребуется внести изменения в файл /etc/postfix/sasl_passwd, убрав номер порта, который следует за именем хоста, как это показано ниже.
smtp-relay. sendinblue.com smtp_username:smtp_password
Сохраните файл и закройте его. После этого заново создайте индексный файл.
sudo postmap /etc/postfix/sasl_passwd
Перезапустите Postfix, чтобы новые настройки начали действовать.
sudo systemctl restart postfix
Теперь вы можете удалить очередь сообщений (попытаться отправить ранее созданные письма).
sudo postqueue - f
Ошибка номер два.
Имейте в виду, что sender_dependent_relayhost_maps не принимает специальные ключевые слова, такие как smtp или local и подобные. Если в логах Postfix появится следующая ошибка, это указывает на то, что вы применили ключевое слово smtp.
Host or domain name not found. Name service error for name= smtp type=A: Host not found
Совет на заметку: smtp_fallback_relay
В Postfix вы можете задать резервный релейный хост. Это позволит Postfix использовать его в случае, если основной SMTP-адресат недоступен (например, отсутствуют записи MX или A) или если основной релейный хост не работает.
Измените главный конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
Вставьте следующую строку в данный файл. Замените secondary. relayhost.com на реальное имя релейного хоста. Этот релейный хост может быть предоставлен Sendinblue или любым другим сервисом SMTP-ретрансляции.
smtp_fallback_relay = [secondary. relayhost.com]:587
Сохраните изменения в файле и закройте его. После этого откройте файл /etc/postfix/sasl_passwd и внесите в него данные учетной записи SMTP для резервного релейного хоста, как указано ранее. В завершение перезапустите Postfix, чтобы обновления начали действовать.
Имейте в виду, что если адресат по SMTP применяет серый список для временного отказа в получении писем, ваш SMTP-сервер Postfix будет задействовать резервный релейный хост.
Правила отправки писем с использованием виртуальных почтовых ящиков.
Представим, что вы настроили корпоративную почту на сторонней платформе, например, Zoho. Теперь у вас есть собственный почтовый сервер с виртуальными почтовыми ящиками. Вы хотите оставить старые адреса на Zoho, но при этом создать новые на своем сервере. В этой ситуации необходимо установить правила пересылки для каждого пользователя, чтобы все сообщения, адресованные старым почтовым ящикам, перенаправлялись на сервер Zoho.
Измените главный файл конфигурации Postfix.
sudo nano /etc/postfix/main.cf
Отыщите параметр virtual_mailbox_maps и внесите hash:/etc/postfix/transport в значение этого поля.
virtual_mailbox_maps = hash:/etc/postfix/transport proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
Сохраните файл и закройте его. Далее в файле /etc/postfix/transport можно установить правила пересылки для устаревших почтовых адресов, как указано ниже. (Примечание: также возможно использовать ключевое слово relay вместо smtp. Оба варианта допустимы в этой ситуации.)
[email protected] smtp:[mx. zoho.com]:25 [email protected] smtp:[mx. zoho.com]:25 [email protected] smtp:[mx. zoho.com]:25
Сохраните файл и закройте его. После этого создайте хеш-таблицу для файла /etc/postfix/transport.
sudo postmap /etc/postfix/transport
После этого перезапустите Postfix.
sudo systemctl restart postfix
Заключение
Надеюсь, этот справочник оказался полезным для вас в использовании транспортных карт Postfix и relayhost-карт в зависимости от отправителя. Если вы считаете этот материал ценным, подписывайтесь на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций.

