SMTP-сервер в Docker: Postfix для отправки почты через внешний сервер

Многим сайтам и скриптам на VPS нужно отправлять письма: уведомления, сброс паролей, отчёты. Отправлять напрямую с IP сервера плохая идея, такие письма часто попадают в спам. Надёжнее пересылать почту через SMTP почтового сервиса (Яндекс 360, Mail.ru, SMTP2GO, Mailgun и т. д.). Сделаем это с помощью Postfix в Docker.

Dockerfile

FROM debian:bookworm-slim
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y postfix libsasl2-modules ca-certificates \
 && rm -rf /var/lib/apt/lists/*
COPY main.cf /etc/postfix/main.cf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 25
ENTRYPOINT ["/entrypoint.sh"]

Пакет libsasl2-modules нужен для авторизации на внешнем SMTP. Пароль в образ не копируем: его передадим при запуске.

main.cf

myhostname = mail.example.com
mydestination =
inet_interfaces = all
mynetworks = 127.0.0.0/8 172.16.0.0/12
relayhost = [smtp.example.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = lmdb:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
maillog_file = /dev/stdout
  • relayhost это SMTP вашего почтового сервиса.
  • mynetworks перечисляет, кому разрешено отправлять. Здесь это localhost и сети Docker.
  • smtp_tls_security_level = encrypt требует шифрования. Старый параметр smtp_use_tls устарел.
  • maillog_file = /dev/stdout выводит логи в docker logs.

entrypoint.sh

#!/bin/sh
set -e
echo "[smtp.example.com]:587 ${SMTP_USER}:${SMTP_PASS}" > /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
postmap lmdb:/etc/postfix/sasl_passwd
exec postfix start-fg

Команда postfix start-fg держит Postfix на переднем плане, как и положено процессу в контейнере.

Сборка и запуск

docker build -t postfix-relay .
docker run -d --name smtp-relay --restart unless-stopped \
  -p 127.0.0.1:25:25 \
  -e SMTP_USER=user@example.com -e SMTP_PASS='пароль-приложения' \
  postfix-relay

Обратите внимание на 127.0.0.1:25:25. Если опубликовать порт на всех интерфейсах, любой в интернете сможет слать спам через ваш сервер, и IP быстро окажется в чёрных списках. Docker при этом обходит правила UFW, подробнее в статье о UFW.

Проверка

sudo apt install swaks
swaks --server 127.0.0.1 --to you@example.com --from robot@example.com
docker logs -f smtp-relay

Что ещё настроить

  • В DNS домена отправителя добавьте SPF и DKIM для выбранного сервиса, иначе письма будут уходить в спам. Проверить записи можно в Easy DNS Lookup.
  • Адрес отправителя должен принадлежать аккаунту на SMTP-сервисе.
  • Для сайта на WordPress укажите 127.0.0.1:25 в SMTP-плагине.

Если не хочется держать свой релей, подойдёт готовый сервис вроде SMTP2GO.

Источники и ссылки


Комментарии загружаются…