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

Я протестировал SMTP-сервер с помощью Telnet:
Telnet успешно подключился к SMTP-серверу.
Telnet позволил мне пройти аутентификацию на SMTP-сервере.
Telnet позволил мне успешно отправить письмо через SMTP-сервер; при этом я использовал те же значения, что и в файле /var/discourse/containers/app.yaml.

Утилита Discourse doctor сообщает, что Discourse успешно подключился к SMTP-серверу.
Однако утилита Discourse doctor сообщает, что Discourse не смог отправить тестовое письмо.

Следовательно, в Discourse есть ошибки, препятствующие отправке писем.

Я бы предположил, что проблема в вашем окружении, а не в багах самого Discourse. :wink:

Случайно вы не используете smtp-relay.gmail.com, возможно, из DigitalOcean? Похоже, что недавно это перестало работать, и пока никто точно не знает почему.

Нет. Поскольку SMTP-сервер работает безупречно, как уже описывалось, и Discourse установлен корректно и правильно отображает экран с запросом на отправку электронного письма для регистрации администратора. Однако это письмо не отправляется.

Я использую локальный SMTP-сервер, расположенный на той же машине, что и контейнер Docker с Discourse.

Я обнаружил ошибку в /var/discourse/shared/standalone/log/rails/production.log:

Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 32)
Delivered mail f915c15e-9c4d-4d4e-9527-81bc4984540c@forum.domain.com (63.7ms)
Job exception: hostname "mail.forum.domain.com" does not match the server certificate

Что означает эта ошибка?

Похоже, что вышеуказанное сообщение об ошибке касается SSL-сертификата сервера.

SSL-сертификат на сервере корректен и содержит правильное имя хоста.

Похоже, это ошибка в Discourse, из-за которой система не может правильно определить SSL-сертификат сервера.

Это похоже не на ошибку в Discourse. Скорее всего, проблема в конфигурации DNS-резолвера хоста или в SSL-сертификате.

Поскольку telnet не использует SSL, вероятно, поэтому вы обнаружили, что он работает. В Linux вы можете продвинуться дальше в тестировании, используя OpenSSL для проверки подключения и анализа сертификатов.

Здесь есть некоторая информация, которая может помочь: https://docs.pingidentity.com/bundle/solution-guides/page/iqs1569423823079.html

HTTPS на сайте работает, так как в адресной строке отображается зелёный замок. С SSL-сертификатом сайта всё в порядке. Проблема заключается в том, как Discourse определяет SSL-сертификат.

Эта ошибка касается не сертификата сайта, а сертификата вашего SMTP-сервиса.

Сертификат службы SMTP — это просто SSL-сертификат сервера, а не SSL-сертификат веб-сайта. SSL-сертификат сервера верный и работает.

При настройке локального SMTP-сервера на той же машине, что и контейнер Discourse, в документации не указаны точные значения параметров SMTP в файле app.yml. Это вызывает значительную путаницу и ошибки.

В настройках app.yml неясно указано, что именно должно быть значением параметра DISCOURSE_SMTP_ADDRESS.

На самом деле это subdomain.domain.com, а не mail.subdomain.domain.com.

Правильные значения:
DISCOURSE_SMTP_ADDRESS: forum.domain.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: postmaster@forum.domain.com
DISCOURSE_SMTP_PASSWORD: "password"
DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)

В сообщении об ошибке, возникающем после неудачной отправки первого письма регистрации, неясно указано, что такое «серверный сертификат». Сообщение об ошибке находится в:
/discourse/shared/standalone/log/rails/production.log
«Job exception: hostname “mail.forum.domain.com” does not match the server certificate».

Однако на самом деле «серверный сертификат» — это просто SSL-сертификат сервера.
Кроме того, в сообщении об ошибке Discourse ошибочно упоминает «hostname», тогда как на самом деле имеется в виду параметр DISCOURSE_SMTP_ADDRESS.

Возникли трудности из-за неопределённости в документации Discourse.

Решение заключалось просто в том, чтобы установить правильный SSL-сертификат на сервер.

Когда проблема была опубликована на форуме Discourse, было получено множество вводящих в заблуждение и неясных ответов.

Discourse следует исправить эти проблемы.

Теперь Discourse Doctor сообщает, что письмо было отправлено:

Отправка письма на admin@email.com. . . 
Тестирование отправки на admin@email.com через forum.domain.com:587.
Подключение к SMTP-серверу успешно.
Отправка на admin@email.com. . . 
Письмо принято SMTP-сервером.

Однако в почтовом ящике получателя, включая папку «Спам», письма нет.

Как можно решить эту проблему?

Проверьте логи вашего локального SMTP-сервера. Если Discourse успешно доставил сообщение на SMTP-сервер, то дальнейшая судьба сообщения уже не зависит от Discourse.

В логах Exim4 появилась сообщение об ошибке. Что оно означает?

2021-01-21 00:39:39 H=(localhost.localdomain) [172.17.0.2] X=TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256 CV=no F=<noreply@forum.domain.com> A=dovecot_plain:postmaster@forum.domain.com rejected RCPT <admin@email.com>: Sender verify failed

Ошибка означает, что проверка отправителя не удалась. Это происходит, когда почтовый сервер не может подтвердить валидность адреса отправителя (noreply@forum.domain.com) в процессе проверки обратного пути (sender verification). Возможные причины:

  1. DNS-запись MX для домена forum.domain.com отсутствует или настроена неверно.
  2. Сервер, отвечающий за домен forum.domain.com, отклоняет запросы на проверку отправителя.
  3. Проблемы с PTR-записью (обратный DNS) для IP-адреса отправителя.
  4. Сервер получателя (email.com) требует строгой проверки отправителя и не принимает письмо из-за неудачи этой проверки.

Рекомендуется проверить конфигурацию DNS для домена forum.domain.com и убедиться, что сервер настроен правильно для обработки запросов на проверку отправителя.