Postfix: разные relayhost для отправителей и доменов через sender_dependent_relayhost_maps
Postfix умеет выбирать relayhost не только глобально для всего сервера. Если разные адреса или домены должны отправлять письма через разные SMTP-шлюзы, используйте sender_dependent_relayhost_maps. Это штатный механизм Postfix и он надёжнее набора shell-скриптов и ручной подмены конфигурации.
Когда это нужно
- несколько доменов используют разных SMTP-провайдеров;
- часть отправителей должна идти через корпоративный relay, а часть — напрямую;
- для разных адресов используются разные SASL-учётные записи;
- нужно постепенно мигрировать домены между SMTP-шлюзами.
Базовая логика
Postfix смотрит на envelope sender и ищет для него соответствующий next-hop в таблице sender-dependent relayhost. Если совпадения нет, может использоваться общий relayhost или стандартная маршрутизация — в зависимости от вашей конфигурации.
Пример main.cf
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = mayТип lookup table может отличаться в зависимости от сборки Postfix. Перед копированием hash: или lmdb: проверьте, какие типы доступны именно на вашей системе.
Таблица relayhost
user1@example.com [smtp.provider-a.example]:587
@example.org [smtp.provider-b.example]:587Квадратные скобки вокруг SMTP-хоста запрещают подменять указанный сервер через MX lookup. Для smarthost это обычно именно то, что нужно.
SASL-пароли
Если релеи требуют авторизацию, храните учётные данные в отдельной таблице с минимальными правами доступа. Не публикуйте этот файл в Git и не вставляйте реальные пароли в документацию или тикеты.
После изменения таблиц
Для map-типов, которым требуется компиляция, выполните соответствующий postmap, затем проверьте конфигурацию Postfix и сделайте reload. После этого отправьте тестовые письма от каждого типа отправителя и посмотрите в логах выбранный relay.
Не путайте адрес From и envelope sender
Маршрутизация sender-dependent опирается на SMTP envelope sender, а не обязательно на заголовок From, который пользователь видит в почтовом клиенте. Это важно при алиасах, bounce-сообщениях и приложениях, которые формируют Return-Path отдельно.
TLS
Для submission на внешние SMTP-шлюзы используйте TLS согласно требованиям провайдера. Не отключайте проверку сертификата глобально ради одного проблемного relay. Ошибку сертификата лучше исправить адресно.
Диагностика
- проверьте результат lookup для конкретного sender;
- посмотрите mail log и очередь;
- убедитесь, что выбран правильный relay и порт;
- проверьте SASL username/password;
- отдельно проверьте DNS, TLS и доступность relay;
- не забывайте о null sender у служебных bounce-сообщений.
Итог: для нескольких SMTP-шлюзов не нужен отдельный Postfix на каждый домен. Sender-dependent relayhost и sender-dependent SASL позволяют держать маршрутизацию в одной понятной конфигурации и менять её без костылей.