SMTP の Office 365 での認証タイプが認識されません

このエラーが発生し、さまざまな対応を試みました。Office 365 を使用しています。

Error: 504 5.7.4 Unrecognized authentication type [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 "your email here " | openssl enc -base64
xxx_encoded_email_xxx
  1. パスワードをエンコード
echo -n "your password here" | 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 認証方式が認識されていないのでしょう。app.yml ファイルに DISCOURSE_SMTP_AUTHENTICATION: login を追加してみましたが、効果はありませんでした。

参考までに、私が発見したものを共有します。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

このまま実行すると読み取りタイムアウトが発生しました。
以下のように修正し、start ではなく new を呼び出すことで、正常に送信できました。

Net::SMTP.new(smtp[:address], smtp[:port]) do |s|
    s.enable_starttls
    s.auth_login(smtp[:user_name], smtp[:password])
end

これは Ruby や rake などのツールを初めて触る経験です。なぜ機能するのか、また一般的なケースにとって「良いこと」なのかは説明できません。
J。

あ、それから、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 コードに渡されません。

この修正コードが他の認証方式でも動作するかは確認していませんが、login 認証の問題は解決します。

確認したところ、Net::SMTP.start の呼び出しに smtp[:authentication] を追加し、app.ymlDISCOURSE_SMTP_AUTHENTICATION: login を設定することで、メールテストページの課題が解決しました。

通常のメールは mail ライブラリを介して送信されると考えており、app.ymlDISCOURSE_SMTP_AUTHENTICATION: login を設定するだけで、ライブラリが正しく機能するはずです。

それでも、lib/tasks/emails.rake をパッチ適用して DISCOURSE_SMTP_AUTHENTICATION 設定を使用すべきだと考えます。これにより、不要なデバッグを節約できるでしょう。

私にはバグに見えます。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 認証の禁止であり、これを有効にするにはメールボックスごとに設定を行う必要があります。この情報が役立つことを願っています。私は昨日の朝、この問題に頭を悩ませました。

特に POP に関しては非常に残念です。Discourse が受信メールボックス向けの IMAP サポートを追加しない限り、受信メールの設定がさらに困難になるでしょう。

受信メールを直接受け取るコンテナ付きの簡単な解決策があります。以前は「straightforward」と呼ばれていましたが、誰かがその名前に異議を唱えたため変更され、現在では見つけることができません。

また、グループ受信トレイ向けの IMAP サポートもあります。ただし、主に Gmail しかサポートされていません。

まあ、いずれにせよ自分自身のメールサーバーを運用することは、最終手段として考慮すべきでしょう。「ダイレクトデリバリー」という用語だったと思いますので、それで検索してみてください。

2023年現在、Exchange で POP3 認証はできなくなりました。

PHPMailerを使用している場合
以下の行をコメントアウト/削除して試してください: //$mail->isSMTP(true);