Документация / Discourse

Настройка почты в Discourse через SMTP

Discourse опирается на почту сильнее большинства приложений: подтверждение регистрации, уведомления, дайджесты, а при желании — режим почтовой рассылки. В установке на Docker своего почтового сервера нет, поэтому нужен SMTP-релей. Настраивается он в app.yml, а не в панели администратора. Ниже — подключение к fmailer.

ℹ
Логин и пароль можно получить на странице токенов домена.

Параметры подключения

ПараметрЗначение
SMTP-хостsmtp.fmailer.ru
Порт587
ШифрованиеSTARTTLS (соединение переводится в TLS до авторизации)
ЛогинЛогин токена вашего домена
ПарольПароль этого токена — показывается один раз, при создании
ℹ
Каждый режим доступен и на высоком порту: 8465 (SSL/TLS), 8587 (STARTTLS) и 8025 (без шифрования). Многие хостинги и облака блокируют исходящие 25, 465 и 587 — если соединение обрывается по таймауту, используйте соответствующий высокий порт.

Правка app.yml

Откройте /var/discourse/containers/app.yml и задайте эти переменные в секции env: — большая часть уже есть в образце файла, некоторые закомментированы:

containers/app.yml
# /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.ru
⚠
app.yml — это YAML: символ # в значении без кавычек начинает комментарий и молча обрезает пароль. Держите его в двойных кавычках.

Если нужен порт 465, поменяйте порт и режим TLS:

# Порт 465 (шифрование с первого байта) вместо 587
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_ENABLE_START_TLS: false

Пересборка контейнера

Изменения в app.yml вступают в силу только после пересборки — она занимает несколько минут:

bash
cd /var/discourse
./launcher rebuild app

Проверка

В панели администратора откройте «Настройки электронной почты» → «Настройки сервера» (в актуальных версиях — /admin/email/server-settings), укажите адрес и нажмите «Отправить тестовое письмо». В «Журналах электронной почты» (/admin/email-logs) видно, что стало с каждым письмом: «Отправлено», «Пропущено», «Возвращено». На сервере конфигурацию проверяет встроенный скрипт — он же предложит отправить тестовое письмо:

bash
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 решил их не отправлять — из-за настроек пользователя или заблокированного адреса. Причина указана в отдельной колонке.

Частые вопросы

Где в Discourse настраивается SMTP?

В стандартной установке на Docker — в файле /var/discourse/containers/app.yml, в переменных DISCOURSE_SMTP_*, а не в панели администратора. При первой установке их туда записывает ./discourse-setup, а чтобы поменять позже, отредактируйте файл и выполните ./launcher rebuild app.

Нужно ли пересобирать Discourse после правки app.yml?

Да. Контейнер читает app.yml только при сборке, поэтому до запуска ./launcher rebuild app из каталога /var/discourse правка ни на что не влияет. Пересборка занимает несколько минут, на это время форум недоступен.

Какой порт использовать в Discourse — 587 или 465?

587 со STARTTLS: Discourse и так работает в этом режиме, достаточно указать порт. Для 465 дополнительно задайте DISCOURSE_SMTP_FORCE_TLS: true и DISCOURSE_SMTP_ENABLE_START_TLS: false, иначе соединение оборвётся с ошибкой SSL «wrong version number».

С какого адреса Discourse отправляет письма?

С адреса из настройки notification_email, которую задаёт переменная DISCOURSE_NOTIFICATION_EMAIL. Через него идёт вся системная почта, поэтому он должен быть на подтверждённом домене — иначе DKIM и SPF не выровнены и письма подтверждения регистрации попадают в спам.

Можно ли обойтись без SMTP?

Новые версии установщика позволяют пропустить SMTP и входить через Discourse ID. Но дайджесты, режим почтовой рассылки и ответы по почте без SMTP не работают, как и классическая регистрация по e-mail.

Почему Discourse неправильно читает пароль SMTP?

app.yml — это YAML: символ # начинает комментарий, а некоторые другие ломают разбор, если значение не в кавычках. Заключите DISCOURSE_SMTP_PASSWORD в двойные кавычки, как в образце файла.

Что дальше