Итак, если тест openssl проходит успешно, но тест подключения, запускаемый discourse-doctor, всё ещё не удаётся при использовании этих настроек, что делать дальше? Несмотря на то, что тест openssl проходит успешно, моё подключение к Discourse всё равно завершается ошибкой 504 5.7.4 Unrecognized authentication type… Предполагается, что не распознаётся метод аутентификации LOGIN. Я пытался добавить DISCOURSE_SMTP_AUTHENTICATION: login в файл app.yml, но это не помогло.
Кстати, вот что я обнаружил. Я зашел в образ Docker и начал экспериментировать со скриптом lib/tasks/emails.rake и файлом config/discourse.conf. Несколько часов спустя, перепробовав все возможные комбинации smtp.office365.com и .mail.protection.outlook.com с методами AUTH login и AUTH plain, я раскомментировал блок выше начала STMP.
# Мы хотели бы сделать это, но Net::SMTP выдает ошибку при использовании starttls
#Net::SMTP.start(smtp[:address], smtp[:port]) do |s|
# s.starttls if !!smtp[:enable_starttls_auto] && s.capable_starttls?
# s.auth_login(smtp[:user_name], smtp[:password])
#end
Запуск этого кода как есть привел к тайм-ауту чтения.
Изменение кода таким образом — вызов new вместо start — привело к успешной отправке.
Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
s.enable_starttls
s.auth_login(smtp[:user_name], smtp[:password])
end
Это мой первый опыт работы с Ruby, rake и им подобными инструментами. Я не могу объяснить, почему это работает или является ли это «хорошим решением» для общих случаев.
Дж.
Кстати, мне так и не удалось настроить работу через my_domain.mail.protection.outlook.com ни на порту 25, ни на 587. Успешно работал только smtp.office365.com:587.
Я использую socketlabs.com в качестве сервиса доставки электронной почты и столкнулся с похожей проблемой. В моём случае решение заключалось в редактировании файла lib/tasks/emails.rake следующим образом:
Измените строку: Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password])
на Net::SMTP.start(smtp[:address], smtp[:port], 'localhost', smtp[:user_name], smtp[:password], smtp[:authentication])
Без этого изменения значение DISCOURSE_SMTP_AUTHENTICATION: login не передаётся в нижележащий код SMTP.
Я не проверял, работает ли модифицированный код для других методов аутентификации, но он решает проблему для аутентификации по логину.
Могу подтвердить, что добавление smtp[:authentication]
в вызов Net::SMTP.start и установка DISCOURSE_SMTP_AUTHENTICATION: login
в app.yml решает проблему со страницей тестирования почты.
Я полагаю, что обычные письма отправляются через библиотеку mail, и для корректной работы библиотеки достаточно установки DISCOURSE_SMTP_AUTHENTICATION: login
в app.yml.
Тем не менее, считаю, что файл lib/tasks/emails.rake следует доработать, чтобы он использовал настройку DISCOURSE_SMTP_AUTHENTICATION. Это избавит от лишних отладок.
В качестве общего обновления по этому вопросу: Microsoft в процессе отключения устаревшей аутентификации для SMTP и POP3, что создаст трудности, если вы используете O365 в качестве почтового провайдера. Политика по умолчанию теперь запрещает SMTP AUTH, и вам нужно включать её для каждого почтового ящика отдельно. Надеюсь, это окажется полезным — вчера утром я бился головой об стену, разбираясь с этим.
Особенно жаль, что это касается POP, так как настройка входящей почты станет гораздо сложнее, если Discourse не добавит поддержку IMAP для входящих почтовых ящиков.
Для входящей почты, включающей контейнер для её получения, существует простое решение. Раньше оно называлось «straightforward», но кто-то возразил против этого названия, и оно было изменено; теперь я не могу его найти.
В любом случае запуск собственного почтового сервера следует рассматривать как крайнюю меру. Полагаю, речь идёт о «прямой доставке» — попробуйте поискать по этому запросу.