The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

啟用 MFA 多因素認證的 Microsoft 365 帳號如何透過 SMTP 發送電子郵件

今天同事回報公司的網路印表機突然無法發送郵件,原本設定好好的運作了三年相安無事,怎麼就突然壞掉了呢?經過一番檢查後發現,原來是因為公司的 Microsoft 365 帳號啟用了 MFA 多因素認證的關係,導致設備無法透過 SMTP 發送郵件。但因為這是一個系統帳戶,根本沒人會去動它,看來是雲端平台的更新導致這個問題,這篇文章我就來說說這次的靈異事件。

Troubleshooting of an SMTP email sending issue caused by multi-factor authentication (MFA) on a Microsoft 365

問題描述

我們公司的印表機是 FUJI XEROX C2060,這台機器三年前剛到貨的時候,我就發現了一個問題,那就是這台機器在設定 SMTP 認證的時候,其「密碼」欄位有個 64 個字元的限制。這個限制很討厭,因為我們公司大多數發信的服務都採用 Twilio SendGrid 為主,但是 SendGrid 的 API Key 預設就是 SMTP 驗證的密碼,而 API Key 是固定長度的 69 個字元,而且不能調整,這樣就無法使用 SendGrid 服務了。

當初因為這個問題,我們只好被迫改用 Office 365 帳號來發信,所以替一個信箱設定了一組「應用程式密碼」,這樣就可以透過 SMTP 來發送郵件了。但是,這個設定已經三年沒有動過了,為什麼突然間就不能用了呢?我一開始還摸不著頭緒,只好到處查找問題。

追查問題的過程

首先,我們先檢查了印表機的 SMTP 設定,發現密碼是對的,而且也沒有被更動過,所以應該不是這個問題。

image

接著,我去檢查了 Microsoft 365 的帳戶,發現這個帳戶在 Microsoft Entra ID 的 Sign-in logs 在今天早上 11:18:55 還有一次成功透過 SMTP 登入的記錄,所以早上應該是好的,直到我到剛剛 19:02:52 才修好:

image

然後我就發現了 Sign-in logs 有一條 Multifactor authentication 認證要求的訊息,這才驚覺可能是 MFA 多因素驗證在搞鬼!

解決方案

接著我大概花了 1 分鐘快速寫完了以下測試程式 (感恩 GPT-4o 幫我快速完成):

async Task Main()
{
  await SendEmailAsync();
}

async Task SendEmailAsync()
{
  var smtpClient = new System.Net.Mail.SmtpClient("smtp.office365.com", 587)
  {
    Credentials = new System.Net.NetworkCredential(Util.GetPassword("SMTP_USER"), Util.GetPassword("SMTP_PASS")),
    EnableSsl = true,
  };

  var mailMessage = new System.Net.Mail.MailMessage
  {
    From = new System.Net.Mail.MailAddress(Util.GetPassword("SMTP_USER")),
    Subject = "Subject",
    Body = "Body",
    IsBodyHtml = true,
  };

  mailMessage.To.Add(Util.GetPassword("SMTP_TEST_USER"));

  await smtpClient.SendMailAsync(mailMessage);
}

然後不出意外的,郵件真的發不出去,錯誤訊息是:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 Client not authenticated to send mail. Error: 535 5.7.139 Authentication unsuccessful, the user credentials were incorrect.

這是一個很不明顯的錯誤訊息,因為我確定密碼是對的,而且也沒有被更動過,最後花了 30 分鐘查各種平台的設定,害我鬼打牆了一下。

因為我此時斷定是 MFA 造成的問題,所以我就開始去找各種 MFA 的設定方式:

  1. My Sign-Ins | Security Info

    這裡「理論上」可以新增「應用程式密碼」(App Password),但是我卻找不到新增的選項!🔥

  2. Multifactor authentication - Microsoft Entra admin center

    然後我到 Microsoft Entra admin center 翻找設定,找不到任何相關的設定。

最後發現,原來設定是藏在 Getting started 頁面的 Additional cloud-based multifactor authentication settings 連結中,這是一個非常老舊的 Azure AD 設定頁面 (Legacy MFA Settings),結果竟然是 app passwords 設定不知為何,突然被關閉了?!

Additional cloud-based multifactor authentication settings

我在允許 app password 設定後,回到 My Sign-Ins | Security Info 加入了一組新的應用程式密碼,又再度鬼打牆測試了十多分鐘,就是無法發信,最後決定先吃飯,讓子彈飛一下。

結果,吃飽後,相同的程式再跑一遍,就可以發信了!🎉 (原來設定完之後,還要給一些些時間讓設定生效)

相關連結

留言評論