Настройка Mail Relay для отправки уведомлений с серверов
Типичная ситуация: cron-задача упала ночью, Zabbix зафиксировал инцидент — а уведомление ушло в никуда, потому что сервер пытается отправить письмо напрямую через порт 25, который заблокирован провайдером или хостером. Приложение получает Connection refused или 554 5.7.1 Relay access denied, письмо теряется, инцидент не замечают. Мы сталкивались с этим десятки раз — поэтому разработали проверенный процесс настройки relay, гарантирующий доставку.
Mail relay решает это в одно действие — сервер отправляет почту на доверенный SMTP-шлюз, который уже знает, как доставить письмо дальше. В этой статье — конкретная конфигурация, типовые ошибки и кейсы для разных инфраструктур.
Почему прямая отправка не работает?
Большинство хостинг-провайдеров и облачных платформ блокируют порт 25 по умолчанию — это защита от спама. Даже если порт открыт, IP-адреса серверов часто попадают в blacklist. Кроме того, почтовые серверы (Exchange, Яндекс 360) требуют аутентификации и TLS. Без relay ваши алерты будут теряться.
Postfix как локальный relay: минимальная конфигурация
Для большинства серверов достаточно настроить Postfix в режиме satellite — он не принимает входящую почту, не хранит очередь долго, просто перенаправляет всё на upstream-relay.
# /etc/postfix/main.cf
myhostname = app01.internal.example.com
mydomain = internal.example.com
myorigin = $mydomain
relayhost = [smtp.sendgrid.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
inet_interfaces = loopback-only
mydestination = Файл с кредами:
# /etc/postfix/sasl_passwd [smtp.sendgrid.net]:587 apikey:SG.xxxxxxxxxxxx После создания — хэшируем и перезапускаем:
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
systemctl reload postfixВместо SendGrid подойдёт любой SMTP: Amazon SES (email-smtp.eu-west-1.amazonaws.com:587), Mailgun, корпоративный Exchange/Office 365 или собственный Postfix на выделенном сервере.
Сравнение популярных SMTP-релеев
| Провайдер | Порт | Аутентификация | Бесплатный лимит | Цена после лимита |
|---|---|---|---|---|
| SendGrid | 587/2525 | API-ключ | 100 писем/день | от $19.95/мес |
| Amazon SES | 587/2587 | SMTP-ключ | 62 000 писем/мес | $0.10 за 1000 писем |
| Mailgun | 587/465 | SMTP-логин | 5 000 писем/мес | $35 за 50 000 писем |
| Внутренний relay | 25 (trusted) | IP-белый список | Неограничен | Только затраты на сервер |
Когда нужен внутренний relay, а не внешний SaaS
В изолированных инфраструктурах — банки, госсектор, периметровые сети без выхода в интернет — внешние SMTP-провайдеры недоступны. Тогда поднимаем внутренний relay-сервер: один Postfix с открытым mynetworks для доверенных подсетей и настроенным smarthost до корпоративного почтового сервера.
# relay.internal — принимает от 10.0.0.0/8, пересылает на Exchange
mynetworks = 127.0.0.0/8, 10.0.0.0/8
relayhost = [mail.corp.example.com]:25
relay_domains =
smtpd_recipient_restrictions = permit_mynetworks, rejectТакой relay не требует аутентификации от внутренних серверов — они в mynetworks. Exchange принимает от relay по IP-based connector.
Как выбрать между внешним и внутренним relay?
Мы рекомендуем внешний relay для облачных инфраструктур — это дешевле и проще в обслуживании. Внутренний relay — для сред с высокими требованиями к безопасности и изоляции. У нас есть опыт настройки обоих вариантов: более 80 проектов, включая банки и госорганы.
Тестирование и диагностика
После настройки — сразу проверка:
# Отправить тестовое письмо
echo "Test relay $(hostname)" | mail -s "relay test" [email protected]
# Следить за очередью
mailq
postqueue -f # принудительная попытка доставки
# Логи в реальном времени
journalctl -u postfix -fЧастая ошибка — SASL authentication failed при правильном пароле. Причина обычно в том, что sasl_passwd.db не обновлён после правки текстового файла (postmap не запустили повторно) или в пароле есть спецсимволы, которые нужно экранировать.
Пример: разбор ошибки SASL authentication failed
При использовании пароля с символом `%` в SendGrid необходимо экранировать его в `sasl_passwd` как `%%`. Иначе Postfix интерпретирует `%` как подстановочный знак. После экранирования — повторно выполнить `postmap`.Что входит в услугу
Настраиваем Postfix relay на каждом сервере или один централизованный relay-хост для всей инфраструктуры. Подключаем к выбранному upstream: SendGrid, SES, Mailgun, корпоративный SMTP. Настраиваем TLS, аутентификацию, ограничение по IP. Проверяем доставку от всех источников уведомлений: cron, Zabbix/Prometheus Alertmanager, приложения.
Срок — от нескольких часов на один сервер до 1-2 дней на инфраструктуру с десятками хостов и нестандартными ограничениями сети. Получите консультацию по вашему проекту — оценим сложность и подберём оптимальное решение под ключ.
Какой relay подходит для моей инфраструктуры?
Для небольших проектов (до 10 серверов) достаточно внешнего SMTP-провайдера — это не требует выделенного сервера и экономит время на обслуживание. Для крупных распределённых систем с десятками хостов и строгими требованиями к доступности лучше поднять внутренний relay — он даёт полный контроль над очередями и логами. Мы поможем определиться с выбором и настроим решение на любой платформе.
Для глубокого понимания механизмов работы Postfix рекомендуется изучить официальную документацию.







