Многим сайтам и скриптам на 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.