Парсинг SMTP-учетных данных в Discourse Doctor не работает (+ не работает email регистрации администратора)

Что ж, для начала: это рабочая среда, и я не могу отправить первое письмо с подтверждением регистрации.

Я уверен, что мои настройки SMTP верны.
Я могу выполнить ping и telnet на мой почтовый сервер через используемый порт, но как только я отправляю команду «EHLO mailserver», соединение закрывается удалённым хостом.

В конце моих логов указано:

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 32)
Delivered mail f3853b94-b772-48c2-b1b7-a78bbcbfc5c1@discourse.mywebsite.com (60177.6ms)
Job exception: Net::ReadTimeout

Я попытался убедиться, что мои настройки SMTP верны, поэтому запустил /var/discourse/discourse-doctor, но он не может проверить мои настройки. Он выводит:

==================== YML SETTINGS ====================
awk: not an option: --field-separator=:
DISCOURSE_HOSTNAME=
awk: not an option: --field-separator=:
SMTP_ADDRESS=
awk: not an option: --field-separator=:
DEVELOPER_EMAILS=
awk: not an option: --field-separator=:
SMTP_PASSWORD=
awk: not an option: --field-separator=:
SMTP_PORT=
awk: not an option: --field-separator=:
SMTP_USER_NAME=
awk: not an option: --field-separator=:
LETSENCRYPT_ACCOUNT_EMAIL=

Однако мой YAML-файл (./containers/app.yml) выглядит абсолютно корректным:

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: mail.redacted.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: redacted@redacted.com
  DISCOURSE_SMTP_PASSWORD: "redacted"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com

Похоже, это нужно исправить. Это согласуется с ошибкой сети, которую вы описали.

Мне кажется, что специальные символы в вашем пароле сбивают с толку Discourse-doctor.

Этот адрес, похоже, не является SMTP-адресом.
Полагаю, что «mail.redacted.com» — это HTTP-адрес.
Думаю, вам стоит это проверить.

@irwinstar, я скрыл реальный почтовый сервер, чтобы не раскрывать его на публичном форуме. Но я могу гарантировать, что настройки верны, так как я скопировал их из своего почтового клиента (работающего) и также сравнил их с настройками SMTP моего реального почтового сервера.

Спасибо за предложение помочь. Я думаю, что проблема в записях SPF/DKIM, поэтому я пытаюсь исправить их.

Тем не менее, discourse-doctor всё ещё должен корректно её парсить. Не совсем понятно, что происходит, так как я сам не редактировал этот файл в vim/nano. Для ясности: YAML был сгенерирован с помощью discourse-setup.

И я думаю, что Discourse сейчас не поддерживает протокол на порту 465. Если ваш почтовый сервер поддерживает порт 587, вы можете изменить его на 587. К сожалению, мой почтовый сервер не может использовать порт 587, поэтому я добавил почтовый прокси вне Discourse.

@irwinstar, если это верно, то это крайне важная информация, которая могла бы объяснить, почему не работает моя настройка электронной почты. У вас есть источник этой информации?

Я не уверен в этом, но я пробовал порт 465 несколько раз. В конце концов я использовал Docker-образ «hieulq/mailproxy» в качестве почтового прокси. Для Discourse я применил следующие настройки в app.yml:

  DISCOURSE_SMTP_ADDRESS: x.x.x.x
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false

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

Привет @simbleau

По моему опыту, SendGrid работает отлично (порт 587).

Вы также можете протестировать SendGrid бесплатно!

Спасибо за предложения.

Я пытаюсь избежать покупки облачных почтовых серверов или использования прокси (потому что, если бы я хотел грязное решение, я бы просто взломал учётную запись администратора), когда у меня уже есть почтовый сервер на HostGator.

Я уверен, что SPF-записи настроены для IP-адреса моего сервера Discourse. Сейчас я просто пытаюсь проверить DKIM-записи.

Если кто-то сможет подтвердить, что порт 465 не разрешён, это будет отличной новостью, так как это остановит меня от углубления в кроличью нору проблемы, которой на самом деле нет. Порт 465 был проблемой, об этом указано в сообщении ниже.

Я добился некоторого прогресса в настройке установки.

Используя порт 587, я успешно выполнил telnet-подключение для отправки полного письма и прошел аутентификацию без проблем. Поэтому я переключился на него.

Теперь при отправке письма я получаю следующую ошибку:

Delivered mail d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
Job exception: hostname "mail.redacted.com" does not match the server certificate

Однако я заметил, что это больше не тайм-аут соединения (который срабатывал после полных 60 секунд), а другое исключение, возникающее за 250 мс.

Вероятно, это связано с тем, что я использовал адрес system@discourse.redacted.com, который внутренне использует почтовый сервер mail.redacted.com.

Честно говоря, я не уверен, как это исправить. Я попробовал следующее:

./launcher enter app
rails r "SiteSetting.notification_email = 'system@mail.redacted.com'"
exit

а затем пересобрал контейнер, чтобы применить это изменение единожды. Но результата нет — та же ошибка.

ИСПРАВЛЕНА ПРОБЛЕМА С ЭЛЕКТРОННОЙ ПОЧТОЙ! (discourse-doctor всё ещё парсит неправильно)

Я немного подробнее изучил Ruby и причины возникновения этой ошибки, что привело меня к этому вопросу на Stack Overflow.

Именно это было причиной. Решение заключалось в изменении настройки SSL-согласования, что подсказало мне отключить этот параметр в файле app.yml:
DISCOURSE_SMTP_ENABLE_START_TLS: false # (опционально, по умолчанию true)

После этого — УСПЕХ!

Это отключит шифрование TLS, в то время как «единственная» проблема заключается в том, что вы используете неверное имя хоста: сервер почты представляет сертификат, в котором указано что-то другое, а не mail.redacted.com. Многие почтовые серверы часто известны под несколькими разными именами хостов; вам нужно лишь выяснить, какое из них используется в их сертификате.

Вы можете попытаться узнать, какое имя хоста он заявляет, и соответственно настроить вашу конфигурацию.

echo | openssl s_client -connect mail.redacted.com:587 -starttls smtp -servername mail.redacted.com 2>/dev/null |openssl x509 -noout -subject

Если это не сработает, вы можете оставить шифрование TLS включенным и ОТКЛЮЧИТЬ ТОЛЬКО проверку сертификата:

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

Спасибо @RGJ! Странно, что CN указан как один из моих поддоменов, никак не связанный с почтой. Это стоит проверить. Благодарю за подсказку.

Все ваши пользователи получат одинаковую информацию.

Если вы в личном порядке поделитесь со мной своим app.yml, я постараюсь разобраться, что именно сбивает с толку discourse-doctor.

Отправлено. Попробуй свои силы.

Ага. Проблема в том, что у вас установлена версия awk, отличная от GNU awk, и параметр --field-separator в вашей версии называется иначе.

Какая у вас версия awk? Какую операционную систему вы используете?

man awk сообщает: Version 1.3.4 2019-12-31 MAWK(1)

cat /etc/os-release выводит:

~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Не могли бы вы отредактировать discourse-doctor и заменить --field-separator на -F?

Кажется, это решит проблему. Если вы подтвердите, я отправлю PR.

Это отчасти сработало. Ошибка исчезла, но теперь ничего не возвращается.

==================== НАСТРОЙКИ YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

Я решил это.

В discourse-doctor измените строку 213 на следующую:

  read_config_result=$(echo $config_line | awk  -F ":" '{print $2}')

Это работает, потому что mawk не любит -F=":", вместо этого он буквально требует пробел, как в -F ":". :roll_eyes:

Открыл PR: Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub