Discourse опирается на почту сильнее большинства приложений: подтверждение регистрации, уведомления, дайджесты, а при желании — режим почтовой рассылки. В установке на Docker своего почтового сервера нет, поэтому нужен SMTP-релей. Настраивается он в app.yml, а не в панели администратора. Ниже — подключение к fmailer.
| Параметр | Значение |
|---|---|
| SMTP-хост | smtp.fmailer.ru |
| Порт | 587 |
| Шифрование | STARTTLS (соединение переводится в TLS до авторизации) |
| Логин | Логин токена вашего домена |
| Пароль | Пароль этого токена — показывается один раз, при создании |
Откройте /var/discourse/containers/app.yml и задайте эти переменные в секции env: — большая часть уже есть в образце файла, некоторые закомментированы:
# /var/discourse/containers/app.yml — в секции env:
env:
# ...
DISCOURSE_SMTP_ADDRESS: smtp.fmailer.ru
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: "<логин токена>"
DISCOURSE_SMTP_PASSWORD: "<пароль токена>" # кавычки обязательны
DISCOURSE_SMTP_ENABLE_START_TLS: true # значение по умолчанию, для наглядности
DISCOURSE_NOTIFICATION_EMAIL: noreply@mail.example.ruapp.yml — это YAML: символ # в значении без кавычек начинает комментарий и молча обрезает пароль. Держите его в двойных кавычках. Если нужен порт 465, поменяйте порт и режим TLS:
# Порт 465 (шифрование с первого байта) вместо 587
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_FORCE_TLS: true
DISCOURSE_SMTP_ENABLE_START_TLS: false Изменения в app.yml вступают в силу только после пересборки — она занимает несколько минут:
cd /var/discourse
./launcher rebuild app В панели администратора откройте «Настройки электронной почты» → «Настройки сервера» (в актуальных версиях — /admin/email/server-settings), укажите адрес и нажмите «Отправить тестовое письмо». В «Журналах электронной почты» (/admin/email-logs) видно, что стало с каждым письмом: «Отправлено», «Пропущено», «Возвращено». На сервере конфигурацию проверяет встроенный скрипт — он же предложит отправить тестовое письмо:
cd /var/discourse
./discourse-doctor| Симптом | Причина и решение |
|---|---|
Net::OpenTimeout | Хостинг блокирует порт — поставьте в DISCOURSE_SMTP_PORT значение 8587 или 8465 с настройками для порта 465. |
SSL_connect ... wrong version number | Режим TLS не соответствует порту. Для 587 нужен STARTTLS, для 465 — FORCE_TLS. |
535 Authentication failed | Неверный логин или пароль токена — проверьте и кавычки. |
| app.yml изменён, ничего не поменялось | Контейнер не пересобран. |
| Тест проходит, письма регистрации в спаме | notification_email не на подтверждённом домене. |
| Письма в разделе «Пропущено» | Discourse решил их не отправлять — из-за настроек пользователя или заблокированного адреса. Причина указана в отдельной колонке. |
В стандартной установке на Docker — в файле /var/discourse/containers/app.yml, в переменных DISCOURSE_SMTP_*, а не в панели администратора. При первой установке их туда записывает ./discourse-setup, а чтобы поменять позже, отредактируйте файл и выполните ./launcher rebuild app.
Да. Контейнер читает app.yml только при сборке, поэтому до запуска ./launcher rebuild app из каталога /var/discourse правка ни на что не влияет. Пересборка занимает несколько минут, на это время форум недоступен.
587 со STARTTLS: Discourse и так работает в этом режиме, достаточно указать порт. Для 465 дополнительно задайте DISCOURSE_SMTP_FORCE_TLS: true и DISCOURSE_SMTP_ENABLE_START_TLS: false, иначе соединение оборвётся с ошибкой SSL «wrong version number».
С адреса из настройки notification_email, которую задаёт переменная DISCOURSE_NOTIFICATION_EMAIL. Через него идёт вся системная почта, поэтому он должен быть на подтверждённом домене — иначе DKIM и SPF не выровнены и письма подтверждения регистрации попадают в спам.
Новые версии установщика позволяют пропустить SMTP и входить через Discourse ID. Но дайджесты, режим почтовой рассылки и ответы по почте без SMTP не работают, как и классическая регистрация по e-mail.
app.yml — это YAML: символ # начинает комментарий, а некоторые другие ломают разбор, если значение не в кавычках. Заключите DISCOURSE_SMTP_PASSWORD в двойные кавычки, как в образце файла.