Настройка SMTP-сервера в Docker для отправки почты

Запустить Postfix в Docker и слать почту с VPS через внешний SMTP (Mailgun, корпоративный relay, провайдер) – нормальная схема, когда не хотите поднимать полноценный MTA «в мир» с PTR/DKIM-танцами на голом 25 порту. Ниже: Dockerfile, main.cf, sasl_passwd, сборка и проверка.

Идея схемы

Контейнер с Postfix принимает письма локально (или с приложений на хосте) и ретранслирует их на relayhost провайдера с SASL и TLS. Наружу с VPS часто уходит уже авторизованный SMTP на 587, а не «открытый» relay.

1. Dockerfile

FROM debian:buster-slim
RUN apt-get update && apt-get install -y postfix sasl2-bin \
    && rm -rf /var/lib/apt/lists/*
COPY main.cf /etc/postfix/main.cf
COPY sasl_passwd /etc/postfix/sasl_passwd
RUN postmap /etc/postfix/sasl_passwd \
    && chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
CMD ["postfix", "start-fg"]
  • FROM – тонкий Debian как база под пакет postfix;
  • COPY main.cf / sasl_passwd – конфиг и учётные данные relay;
  • postmap – hash-карта паролей для smtp_sasl_password_maps;
  • start-fg – Postfix на переднем плане, удобно для Docker.

На новых хостах имеет смысл взять более свежий Debian/Ubuntu-slim и актуальные пакеты; buster здесь как рабочий пример из исходной схемы.

2. main.cf

myhostname = yourdomain.com
mydestination = yourdomain.com, localhost
relayhost = [smtp.yourprovider.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
# при необходимости:
# smtp_tls_security_level = encrypt
  • myhostname – FQDN, от которого представляется Postfix;
  • relayhost – SMTP провайдера (часто 587 submission);
  • smtp_sasl_* – логин/пароль на relay;
  • smtp_use_tls – шифрование до провайдера.

Подставьте реальный hostname, домен и host:port из панели SMTP-провайдера. Квадратные скобки вокруг хоста в relayhost отключают MX-lookup – обычно так и нужно для submission.

3. sasl_passwd

Файл рядом с Dockerfile (потом копируется в образ). Права на хосте держите жёсткими, в git не коммитьте.

[smtp.yourprovider.com]:587 username:password

После правок внутри контейнера/образа нужен postmap (в Dockerfile уже есть). Для runtime-секретов лучше volume или Docker secrets, а не пароль в слое образа навсегда.

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

docker build -t postfix-smtp .
docker run -d -p 25:25 --name smtp-server postfix-smtp

Порт 25 с хоста удобен, если приложения шлют на localhost:25. Если Postfix только для локальных контейнеров, можно не публиковать 25 наружу, а подключать через docker network и имя сервиса.

Логи:

docker logs -f smtp-server

5. Тестовая отправка

С хоста (нужен клиент mail/sendmail, либо отправка из другого контейнера в сеть):

echo "Test message" | mail -s "Test Subject" user@example.com

В приложении (WordPress, Laravel и т.д.) укажите SMTP host = IP/hostname контейнера или 127.0.0.1, порт 25 – либо сразу SMTP провайдера, минуя локальный Postfix, если relay из приложения проще.

Практические замечания

  • TLS – для submission почти всегда обязателен; смотрите логи при reject;
  • секреты – не кладите боевой sasl_passwd в публичный Dockerfile-контекст без .dockerignore;
  • сеть – не открывайте 25 в интернет «на всех», если это только исходящий relay с localhost;
  • SPF/DKIM/DMARC – настраиваются на стороне домена и провайдера, не «магией» контейнера;
  • образ – для прода обновите base image и закрепите теги, buster-slim уже устаревает.

Кратко

Собираете образ с Postfix, прописываете relayhost и sasl_passwd, публикуете порт только тем, кому нужно слать почту, проверяете docker logs и тестовое письмо. Для продакшена вынесите секреты из слоя образа и согласуйте DNS-записи домена с SMTP-провайдером.

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


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