После установки Curl может отправлять почту, но Discourse — нет. Помогите исправить?

Привет!

В тексте ниже замените <DOT> на . — так как я новый пользователь, Discourse не позволяет мне публиковать ссылки.

Я установил Discourse на только что созданный сервер в облаке Hetzner. URL-адрес корректно разрешается: forum<DOT>thewizardofosc<DOT>com.

Однако письмо, на которое я зарегистрировался, так и не было отправлено. В файле лога сообщение от Discourse гласит: Net::ReadTimeout. Это что-то значит?

telnet подключается — команда "telnet mail<DOT>thewizardofosc<DOT>com 465" возвращает "Connected to thewizardofosc<DOT>com".

Также curl успешно отправляет письмо!

Выполнив следующую команду:
curl --ssl smtps://mail<DOT>thewizardofosc<DOT>com --mail-from discourse@thewizardofosc<DOT>com --mail-rcpt <VARIOUS_WORKED> --upload-file email.txt --user 'discourse@thewizardofosc<DOT>com:<PASSWORD>'

Письмо отправляется успешно.

Так почему же Discourse не отправляет?

Ниже приведены, как я полагаю, соответствующие фрагменты моего файла app.yml:

## при первой регистрации, например 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'iliasb@thewizardofosc<DOT>com'

## TODO: SMTP-сервер, используемый для подтверждения новых аккаунтов и отправки уведомлений
# Для работы требуются SMTP-адрес, имя пользователя и пароль
# ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
DISCOURSE_SMTP_ADDRESS: mail<DOT>thewizardofosc<DOT>com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: discourse@thewizardofosc<DOT>com
DISCOURSE_SMTP_PASSWORD: <PASSWORD>
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)

## Если вы добавили шаблон Lets Encrypt, раскомментируйте строку ниже, чтобы получить бесплатный SSL-сертификат
LETSENCRYPT_ACCOUNT_EMAIL: me@example<DOT>com

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

Я прошел все шаги здесь: Troubleshoot email on a new Discourse install - #2

К сожалению, безрезультатно. Запуск команды discourse-doctor выдаёт тот же результат: Net::ReadTimeout, который я также вижу в логе shared/standalone/log/rails/production.log.

Привет!

Вы имеете в виду shared/standalone/log/rails/production.log?

Там я вижу:

Delivered mail 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142.6ms)
Job exception: Net::ReadTimeout

Странно. Если вы можете подключиться извне контейнера, попробуйте выполнить эту команду curl внутри контейнера. Единственное предположение — у вас проблема с сетью Docker.

Джей прав.

Следующим логичным шагом, @onar3d, будет попробовать выполнить ваш тест с помощью curl внутри контейнера.

Я только что проверил за вас: curl уже установлен в контейнере, так что вам, по крайней мере, не нужно его устанавливать.

docker exec -it app bash
root@hostname-app/# curl --version
curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1d zlib/1.2.11 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.0 nghttp2/1.36.0 librtmp/2.3
Release-Date: 2019-02-06
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

Надеюсь, это поможет.

Интересное предложение!

Но я зашёл в Docker с помощью команды “docker exec -it DOCKERID bash” и использовал ту же команду curl, и это тоже сработало.

Спасибо, я только что попробовал, и всё работает отлично!

Значит, Docker не может быть заблокирован…

Привет, @onar3d

Это отчаянная попытка, но так как вы используете порт 465 вместо порта 587, попробуйте добавить следующее в ваш файл конфигурации контейнера yml:

DISCOURSE_SMTP_ENABLE_START_TLS: false

Затем пересоберите контейнер и посмотрите, повезёт ли вам :slight_smile:

Справка:

Например, Gmail предоставляет следующие порты и методы аутентификации:

  • TLS/STARTTLS (иногда называется явным TLS): использует порт 587
  • SSL (иногда называется неявным TLS): использует порт 465

… рискнём в этот раз… :slight_smile: но, возможно, нам повезёт

Если не сработает, вы всегда сможете вернуться к предыдущей версии.

Спасибо!

Я только что попробовал, письмо не отправилось с Discourse :confused:

Да, это было маловероятно… Извините, что потратил ваше время на это!

Моя единственная другая «безумная идея» на данный момент — проверить, сможете ли вы зайти на свой почтовый сервер (какой бы он ни был) и установить порт 587 (многие SMTP-провайдеры предлагают выбор), и снова «бросить кости» с DISCOURSE_SMTP_ENABLE_START_TLS: true, разумеется.

Честно говоря, обычно я не «бросаю кости» и больше ориентирован на факты; поэтому, если вы не хотите пробовать, я прекрасно понимаю вас, @onar3d!!

Спасибо! К сожалению, у меня нет доступа для изменения этого, это один из тех «под ключ» вариантов, настроенных моим провайдером.

Привет, @onar3d!

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

Всего наилучшего.

После ещё нескольких попыток (огромное спасибо @IAmGav!) подтвердилось, что моя настройка Discourse работает с другим почтовым сервером, что исключает ряд вариантов для проверки.

Мой провайдер почтового сервера ответил мне сообщением об ошибке из их логов и предложением:

Инженер проверил логи, и ошибка, зафиксированная с их IP-адреса, связана с настройками SSL. Скорее всего, используется старая версия или устаревшие настройки подключения.

Подтверждение:
Ошибка TLS при подключении от [95.216.139.49]:33568 SSL_accept: TCP-соединение закрыто удалённой стороной.

Попробуйте отключить режим SSL, чтобы проверить, заработает ли это.

Я попробовал установить переменную DISCOURSE_SMTP_ENABLE_START_TLS в значение false, как указано выше, на портах 465 и 26 (указанных моим провайдером как порт для подключения без SSL), но ни один из вариантов не сработал.

Может ли это быть связано с тем, что я ещё не приобрёл SSL-сертификат для домена thewizardofosc.com? Я понял это, прочитав дополнительную информацию.

Если это не работает с вариантом без SSL, то это не будет работать и с платным SSL. Ваш хостинг-провайдер электронной почты должен предоставить вам бесплатный SSL-сертификат Let’s Encrypt.

Уважаемый @onar3d,

Возможно, стоит запустить ваши тесты curl с включённым параметром подробного вывода -v, чтобы вы могли полностью проанализировать успешное рукопожатие, а затем двигаться от этого анализа в обратном направлении.

Вы можете использовать этот параметр подробного вывода для реверс-инжиниринга того, что работает :slight_smile:

Надеюсь, это поможет.