今天同事回報公司的網路印表機突然無法發送郵件,原本設定好好的運作了三年相安無事,怎麼就突然壞掉了呢?經過一番檢查後發現,原來是因為公司的 Microsoft 365 帳號啟用了 MFA 多因素認證的關係,導致設備無法透過 SMTP 發送郵件。但因為這是一個系統帳戶,根本沒人會去動它,看來是雲端平台的更新導致這個問題,這篇文章我就來說說這次的靈異事件。
問題描述
我們公司的印表機是 FUJI XEROX C2060,這台機器三年前剛到貨的時候,我就發現了一個問題,那就是這台機器在設定 SMTP 認證的時候,其「密碼」欄位有個 64
個字元的限制。這個限制很討厭,因為我們公司大多數發信的服務都採用 Twilio SendGrid 為主,但是 SendGrid 的 API Key 預設就是 SMTP 驗證的密碼,而 API Key 是固定長度的 69
個字元,而且不能調整,這樣就無法使用 SendGrid 服務了。
當初因為這個問題,我們只好被迫改用 Office 365 帳號來發信,所以替一個信箱設定了一組「應用程式密碼」,這樣就可以透過 SMTP 來發送郵件了。但是,這個設定已經三年沒有動過了,為什麼突然間就不能用了呢?我一開始還摸不著頭緒,只好到處查找問題。
追查問題的過程
首先,我們先檢查了印表機的 SMTP 設定,發現密碼是對的,而且也沒有被更動過,所以應該不是這個問題。
接著,我去檢查了 Microsoft 365 的帳戶,發現這個帳戶在 Microsoft Entra ID 的 Sign-in logs
在今天早上 11:18:55
還有一次成功透過 SMTP 登入的記錄,所以早上應該是好的,直到我到剛剛 19:02:52
才修好:
然後我就發現了 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 的設定方式:
-
My Sign-Ins | Security Info
這裡「理論上」可以新增「應用程式密碼」(App Password),但是我卻找不到新增的選項!🔥
-
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 設定不知為何,突然被關閉了?!
我在允許 app password
設定後,回到 My Sign-Ins | Security Info 加入了一組新的應用程式密碼,又再度鬼打牆測試了十多分鐘,就是無法發信,最後決定先吃飯,讓子彈飛一下。
結果,吃飽後,相同的程式再跑一遍,就可以發信了!🎉 (原來設定完之後,還要給一些些時間讓設定生效)
相關連結