SMTP: тип аутентификации не распознан в Office 365

Появляется эта ошибка, и я перепробовал множество вариантов. Использую Office 365.

Ошибка: 504 5.7.4 Неопознанный тип аутентификации [MN2PR20CA0010.namprd20.prod.outlook.com]

Настройки здесь:

  DISCOURSE_SMTP_ADDRESS: smtp.office365.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true

Сначала протестируйте вашу конфигурацию с помощью инструмента openssl.

  1. Закодируйте имя пользователя Office365
echo -n "ваша почта здесь " | openssl enc -base64
xxx_encoded_email_xxx
  1. Закодируйте пароль
echo -n "ваш пароль здесь" | openssl enc -base64
xxx_encoded_password_xxx
  1. Откройте соединение
openssl s_client -connect SMTP.office365.com:587 -starttls smtp -quiet -crlf
  1. Проверьте аутентификацию
  • Дождитесь сообщения 250 SMTPUTF8
  • Отправьте EHLO SMTP.office365.com
  • Дождитесь ответа
    250-PR3P189CA0029.outlook.office365.com Hello [88.138.0.68]
    250-SIZE 157286400
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-AUTH LOGIN XOAUTH2
    250-8BITMIME
    250-BINARYMIME
    250-CHUNKING
    250 SMTPUTF8
    
  • Отправьте AUTH LOGIN
  • Дождитесь 334 VXNlcm5hbWU6
  • Отправьте закодированное имя пользователя xxx_encoded_email_xxx
  • Дождитесь 334 UGFzc3dvcmQ6
  • Отправьте закодированный пароль xxx_encoded_password_xxx
  • Дождитесь ответа 235 2.7.0 Authentication successful

Итак, если тест 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. Это избавит от лишних отладок.

Похоже на :bug:. Я отправил PR:

Привет,

Net::SMTP.start(smtp[:address], smtp[:port], ‘localhost’, smtp[:user_name], smtp[:password], smtp[:authentication])
rescue Exception => e

В моей текущей версии исправление применено, как показано выше, но ошибка всё ещё сохраняется.

Ошибка: 504 5.7.4 Нераспознанный тип аутентификации с smtp.office365.com.

У кого-нибудь есть идеи?

Как мне отредактировать скрипт lib/tasks/emails.rake, чтобы это заработало?

В качестве общего обновления по этому вопросу: Microsoft в процессе отключения устаревшей аутентификации для SMTP и POP3, что создаст трудности, если вы используете O365 в качестве почтового провайдера. Политика по умолчанию теперь запрещает SMTP AUTH, и вам нужно включать её для каждого почтового ящика отдельно. Надеюсь, это окажется полезным — вчера утром я бился головой об стену, разбираясь с этим.

Особенно жаль, что это касается POP, так как настройка входящей почты станет гораздо сложнее, если Discourse не добавит поддержку IMAP для входящих почтовых ящиков.

Для входящей почты, включающей контейнер для её получения, существует простое решение. Раньше оно называлось «straightforward», но кто-то возразил против этого названия, и оно было изменено; теперь я не могу его найти.

Также существует поддержка IMAP для групповых почтовых ящиков. Однако она в основном поддерживает только Gmail.

В любом случае запуск собственного почтового сервера следует рассматривать как крайнюю меру. Полагаю, речь идёт о «прямой доставке» — попробуйте поискать по этому запросу.

По состоянию на 2023 год аутентификация POP3 в Exchange больше не поддерживается.

Если вы используете PHPMailer, попробуйте закомментировать или удалить эту строку: //$mail->isSMTP(true);