[.Net]如何讓 asp.net 的網頁程式可以連接 Office 365 來發送郵件

解決 TLS 1.2 和 asp.net 網站上設定問題

這一陣子一些客戶因為資安的問題,紛紛開始詢問起公司產品有關支援 TLS 1.2 的異常,原本只是很單純的網站上透過 IIS Crypto 的工具,設定後重新開機,讓 IIS 上走 HTTPS 的時候,可以限制走 TLS 1.2 即可,就沒有太多的去煩惱這樣的問題。

但就在前一陣子,有客戶表示因為產品不支援 TLS 1.2,導致他們需要透過 Office 365 去寄信,會發生失敗的問題,因此就花了一點時間整理一下相關設定和處理過程。

首先要讓 Office 365 能透過 Client 端應用程式去寄信,是需要設定的,因為 Office 365 預設使用者帳號是沒有開放 SMTP 的對外使用,因此需要先去開啟設定。這部分要請管理者,先透過 Office 365 的 admin center 來做設定。先選擇「作用中的使用者

接著挑選我們所要設定的使用者,進入該帳號進行設定。

進入後選擇「郵件」→ 「管理電子郵件App

進入後會看到「已驗證的SMTP」並沒有勾選起來,因此如果我們要用程式來寄信,那麼這個選項就一定要勾選起來才可以。


當完成上述的設定,我們就簡單用一個 WinForm 的程式來測試看看,在網路上也都可以找到相關的程式碼,因此測試一下,果然可以順利的使用 Office 365 來寄信了。

        private void SendMail()
        {
            MailMessage msg = new MailMessage();
            msg.To.Add(new MailAddress("James@xxxxx.com", "James"));
            msg.From = new MailAddress("demo@xxxxx.onmicrosoft.com", "demo");
            msg.Subject = "This is a Test Mail";
            msg.Body = "This is a test message using Office 365";
            msg.IsBodyHtml = true;

            using (SmtpClient client = new SmtpClient())
            {
                client.UseDefaultCredentials = false;
                client.Credentials = new System.Net.NetworkCredential("demo@5L2FStudio.onmicrosoft.com", "xxxxx");
                client.EnableSsl = true;
                client.Port = 587; 
                client.Host = "smtp.office365.com";
                client.DeliveryMethod = SmtpDeliveryMethod.Network;
                client.Timeout = 600000;
                try
                {
                    client.Send(msg);
                    return true ;
                } catch(Exception ex)
                {
                    return false ;
                }
            }
        }

原本以為程式中開啟了 SSL , 並且指定好對應的 Mail Server , 且測試也都正常,看起來網頁程式應該也都可以比照辦理了。但沒有想到,這樣的程式碼在同樣的環境上,使用 WinForm 是可以順利寄信,但是換成 asp.net 的網頁,卻是沒有辦法正常寄信,這實在是很令人困擾。

後來想說難道是 IIS 上設定所導致的問題嗎 ? 看了一下應用程式集區的設定,看來是因為 .NET CLR 版本設定為 v4.0.30319 所引發出來的問題,但是這個部分又沒有辦法做個調整,因此看起來只能調整程式了。

在反覆測試過程中發現,當我們在 asp.net 的網頁環境下,預設的 System.Net.ServicePointManager.SecurityProtocol 的設定值會是 SSL 和 TLS 1.0 , 因此我們就從這裡來做修改,我們在程式中加入以下的設定

System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol |  
		System.Net.SecurityProtocolType.Tls11 |  
		System.Net.SecurityProtocolType.Tls12 ;	

將 TLS 1.1 和 TLS 1.2 也都加入。

當完成上述設定之後,我們在重新測試一下原本寄信的功能,果然可以順利將 Mail 透過 Office 365 來作寄送了。