# 啟用 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](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6640a25a9893345038e1-fe546424-41fb-4835-b2d9-341ff094cef2.webp)

### 問題描述

我們公司的印表機是 [FUJI XEROX C2060](https://www.fujifilm.com/fbtw/zh-tw/products/tw-multifunction-printers/apeos-c3060-c2560-c2060)，這台機器三年前剛到貨的時候，我就發現了一個問題，那就是這台機器在設定 SMTP 認證的時候，其「密碼」欄位有個 `64` 個字元的限制。這個限制很討厭，因為我們公司大多數發信的服務都採用 [Twilio SendGrid](https://sendgrid.com/) 為主，但是 SendGrid 的 API Key 預設就是 SMTP 驗證的密碼，而 API Key 是固定長度的 `69` 個字元，而且不能調整，這樣就無法使用 SendGrid 服務了。

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

### 追查問題的過程

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/d5e1f3e4af97d09dd0ea-ef7a79d4-c0f3-4df4-a84b-549049e77b02.jpg)

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

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/b74b14d368da3ae93baf-43cb16dc-e97a-408f-83cf-10e72bf899aa.jpg)

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

### 解決方案

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

```csharp
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](https://mysignins.microsoft.com/security-info)
    
    這裡「理論上」可以新增「應用程式密碼」(App Password)，但是我卻找不到新增的選項！🔥
    
2.  [Multifactor authentication - Microsoft Entra admin center](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/MultifactorAuthenticationMenuBlade/~/GettingStarted/fromProviders~/false/fromNav/)
    
    然後我到 [Microsoft Entra admin center](https://entra.microsoft.com/) 翻找設定，找不到任何相關的設定。
    

最後發現，原來設定是藏在 `Getting started` 頁面的 `Additional cloud-based multifactor authentication settings` 連結中，這是一個非常老舊的 Azure AD 設定頁面 (Legacy MFA Settings)，結果竟然是 [app passwords](https://learn.microsoft.com/en-us/entra/identity/authentication/howto-mfa-app-passwords) 設定不知為何，突然被關閉了？！

![Additional cloud-based multifactor authentication settings](https://stwillblogassets.blob.core.windows.net/files/images/external/github.com/965e795fc5d4f3f06a5a-3400b6fe-d455-4904-9811-e8eadb51a367.jpg)

我在允許 `app password` 設定後，回到 [My Sign-Ins | Security Info](https://mysignins.microsoft.com/security-info) 加入了一組新的應用程式密碼，又再度鬼打牆測試了十多分鐘，就是無法發信，最後決定先吃飯，讓子彈飛一下。

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

### 相關連結

-   [我的登入 (My Sign-Ins) > 安全性資訊 (Security Info)](https://mysignins.microsoft.com/security-info)
-   [How to set up a multifunction device or application to send emails using Microsoft 365 or Office 365](https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/how-to-set-up-a-multifunction-device-or-application-to-send-email-using-microsoft-365-or-office-365?WT.mc_id=DT-MVP-4015686)
