Есть два способа отправки писем через локальный SMTP-сервер:
- Подключение и аутентификация на порту отправки, например 587 с STARTTLS или 465 с явным/непосредственным TLS => сетевой запрос, проверка и применение ограничений через
smtpd. - Использование
sendmailили аналогичных утилит, которые вызывают локальную командуpickup(в случае Postfix), не устанавливая сетевое соединение и обходя все проверки и ограничения, настроенные для службы отправкиsmtpd.
Второй вариант проще и быстрее, он реализован в распространённых средах выполнения и фреймворках, таких как PHP Mailer и эта Ruby-библиотека для работы с почтой, которую использует Discourse. При этом аутентификация обходится, и нигде не нужно хранить учётные данные в открытом виде. Иными словами: в данном случае SMTP-сервер не используется вовсе, задействуется только SMTP-клиент.
Я имею в виду, что использование порта отправки не должно оказывать существенного влияния на нагрузку сервера по сравнению с тем, что Discourse делает в остальном. Вторую проблему можно решить, например, правилом smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject на порту отправки, чтобы разрешать отправку с loopback-IP-адресов (по умолчанию — настройка mynetworks) до выполнения любой аутентификации. Если запрос из контейнера приходит с другого IP-адреса, его можно добавить в mynetworks. Думаю, именно так всё работало в случае темы, на которую я ссылался ранее.
Увидим при следующем обновлении/пересборке нашего Discourse, когда будут применены изменённые настройки SMTP. Сообщу, как всё сработает.
Но всё же интересно узнать, есть ли другие способы и что именно означает настройка «Метод доставки».
Postfix работает на хосте, а не внутри контейнера, но особой разницы это не создаст, поскольку аутентификация всё равно остаётся сетевой.
Да, подумав позже, становится ясно, что sendmail и подобные утилиты с хоста или из другого контейнера не могут работать внутри контейнера, поскольку им требуется прямой доступ к значительной части исполняемых файлов Postfix, библиотек и конфигураций, насколько я понимаю. Разве что существует некое «магическое» сокет-устройство, которое можно смонтировать в контейнер или что-то в этом роде
.