Использовать локальный почтовый сервер/sendmail для исходящей почты?

Мы настроили собственный почтовый сервер и я задумался, как лучше всего использовать его с контейнером Docker для Discourse.

Конечно, я могу просто настроить наши SMTP-данные и учётные данные, но это кажется излишними накладными расходами, поскольку SMTP-сервер работает на той же машине.

sendmail работает, но Discourse находится в контейнере и, следовательно, не имеет доступа к sendmail на хосте.

Поиск по этому вопросу на форуме даёт один пример, где DISCOURSE_SMTP_DOMAIN использовался без учётных данных, и то же самое с swaks внутри контейнера работает: How to get Discourse to work with Postfix - #18 by sonmicrosystems
Я полагаю, что в этом случае всё ещё используется обычная отправка SMTP по порту по умолчанию, и Postfix принимает её без аутентификации, поскольку запрос приходит с localhost?

Знает ли кто-нибудь о другом методе? Я вижу, что используемая Ruby-библиотека в целом поддерживает всё: GitHub - discourse/mail: A Really Ruby Mail Library · GitHub
В настройках Discourse меня привлекло поле «Метод доставки»:

Я не могу изменить эти настройки в графическом интерфейсе, полагаю, потому что YAML-файл контейнера принудительно устанавливает их через DISCOURSE_SMTP_ADDRESS и т. д.? Но я не могу найти переменную для метода доставки.

Возможно, кто-то знает другой способ, а до тех пор я настраиваю обычную аутентификацию через порт отправки SMTP. Кстати, спасибо за DISCOURSE_SMTP_FORCE_TLS, добавленный относительно недавно, но пока не включённый ни в один пример (хотя должен). Я не планирую разрешать STARTTLS, а только неявный/немедленный TLS.

Какие именно лишние накладные расходы? Вам ведь всё равно нужно как-то передавать данные из Discourse на SMTP-сервер? Или нет?

P.S.: если это другой контейнер, то теоретически можно использовать сеть bridge и указывать имя контейнера smtp вместо хоста, если именно это вы имеете в виду, но это не даст никаких преимуществ в производительности.

Есть два способа отправки писем через локальный SMTP-сервер:

  1. Подключение и аутентификация на порту отправки, например 587 с STARTTLS или 465 с явным/непосредственным TLS => сетевой запрос, проверка и применение ограничений через smtpd.
  2. Использование 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, библиотек и конфигураций, насколько я понимаю. Разве что существует некое «магическое» сокет-устройство, которое можно смонтировать в контейнер или что-то в этом роде :smile:.

Прошло уже довольно много времени с тех пор, как я так глубоко погружался в тонкую настройку sendmail. У меня есть стек mailcow на одной виртуальной машине и Discourse на другой. Не знаю, стоит ли когда-нибудь копать так глубоко, кроме как ради интереса.

Желаю вам всем удачи в ваших приключениях, расскажите потом, что вы узнали.

Скорее всего, нет :sweat_smile:. Но я перфекционист в определённых ситуациях, и мне нравится углубляться в детали и изучать всё до мелочей. Мне потребовалось несколько вечеров, чтобы шаг за шагом настроить Dovecot, Postfix, rspamd, dkimpy-milter, PostSRSd и т. д., изучая почти каждую доступную настройку, почему значения по умолчанию именно такие, нужно ли нам что-то изменить и почему. Но в итоге теперь я, кажется, понимаю большинство вещей лучше, чем большинство авторов случайных руководств по настройке почтовых серверов :face_with_tongue:.

Я перемещаю эту тему в #installation:hosting. Как вы знаете, прочитав официальные инструкции по установке, мы не рекомендуем пытаться самостоятельно разместить свой почтовый сервер. Работа с электронной почтой — это сложно!

Не совсем понятно, какое отношение Discourse имеет к тому, может ли система дополнительно размещать почтовый сервер или нет? Конечно, за исключением того факта, что это теоретически открывает ещё один способ отправки писем.

Однако для получения писем (это отдельная тема) это имеет значение, поскольку в таком случае нельзя разместить контейнер для получения почты, по крайней мере, не прослушивая порт 25 напрямую. Но использование прямого API получения писем Discourse оказалось всего лишь 2–3 строками в конфигурации Postfix: Is there a way to only IMAP polling for incoming emails - #2 by MichaIng

Но я согласен, что правильная настройка почтового сервера была не самой лёгкой задачей, как упоминалось выше. Зато очень интересно учиться :slightly_smiling_face:.

Да! Это, безусловно, сложно и интересно. В прошлом я сам проходил через свои приключения, устанавливая всевозможные сервисы и пытаясь запускать их самостоятельно! :upside_down_face:

Я рад, что вы будете обновлять эту тему своими знаниями на благо смелых будущих путешественников, включая вас самих. Но имейте в виду, что категория Support предназначена для официально поддерживаемых установок, ядра Discourse и официальных плагинов и компонентов.

Что. Dovecot хорош. Тогда зачем Postfix? Почему не Dovecot + Exim?

Что не так с Postfix? Он входил в первое руководство по настройке почтового сервера, которое я прочитал, и его внутренние возможности фильтрации для раннего сокращения спама и доступа ботов в конвейере показались веским аргументом.

Что ж, это немного не по теме, касается использования sendmail/pickup в Discourse.

Отмечаю это как решённое/ответленное. Имеет смысл, что контейнер Discourse не может получить доступ к sendmail хоста, независимо от того, какой это сервер. Поэтому ему нужно использовать SMTP-отправку, для чего можно аутентифицироваться, например, через диапазон IP-адресов контейнера Docker в Postfix, минуя аутентификацию passdb/userdb в Dovecot.