1. 程式人生 > >在 ASP.NET Core 中傳送郵件遇到的坑_學習筆記 使用GB2312編碼報錯的問題.

在 ASP.NET Core 中傳送郵件遇到的坑_學習筆記 使用GB2312編碼報錯的問題.

功能需求

        因為專案需要有個忘記密碼驗證郵箱再重新修改密碼的功能,然後我選用了很簡單的一個方案,通過驗證登入使用者的郵箱然後傳送郵件,通過這個郵件傳送的連結地址來最後實現密碼修改的小功能。

專案環境及實現

         網上有人說目前 .NET Core 還不支援 SMTP 協議,我使用的.net core 2.1這個版本還是可以的。但是1.0,1.1的舊版本是不行的,有興趣可以去試,我是從1.0升級上來才發現的...當然還可藉助於一些第三方元件來達到目的,具體可參考資料

https://www.cnblogs.com/savorboard/p/aspnetcore-email.html, 下面我介紹一下我的方法:

簡單郵件傳送核心程式碼如下:

 1         public RequestResult SendEmail(EmailModel model)
 2         {
 3 
 4             SmtpClient client = new SmtpClient()
 5             {
 6                 Host = model.SmtpServer, //"smtp.qq.com";
 7
Port = 25, 8 //通過網路傳送到SMTP伺服器 9 DeliveryMethod = SmtpDeliveryMethod.Network, 10 //發件人登入郵箱的使用者名稱和密碼 11 Credentials = new NetworkCredential(model.UserId, model.Password.Trim()) 12 }; 13 MailAddress fromAddress = new
MailAddress(model.SendEmail, model.SendName); 14 MailAddress toAddress = new MailAddress(model.ReceiveEmail, model.ReceiveName); 15 MailMessage mailMessage = new MailMessage(fromAddress, toAddress); 16 mailMessage.Subject = "測試郵件"; 17 mailMessage.Body = "einspect系統測試郵件密碼是否正確"; 18 mailMessage.SubjectEncoding = Encoding.UTF8; 19 mailMessage.BodyEncoding = Encoding.UTF8;// Encoding.GetEncoding("GB2312"); 20 mailMessage.Priority = MailPriority.High; 21 try 22 { 23 client.Send(mailMessage);//傳送郵件 24 result.Message = "傳送成功!"; 25 result.IsSuccess = true; 26 } 27 catch (Exception ex) 28 { 29 // 1. 連線SMTP伺服器失敗 30 // 2. 使用者名稱或密碼驗證錯誤 31 // 3. 超時 32 // 這三種情況導致丟擲SmtpClient異常 33 // ------- 34 result.Message = "測試失敗!"; 35 result.IsSuccess = false; 36 } 37 38 return result; 39 }

 

總結經驗

        【另外我已把我的DEMO原始碼打包,歡迎下載,地址:https://download.csdn.net/download/buxaingzhangda/10874816

  • 遇到的第一個坑,郵箱不可用. has no permission 這樣的錯誤.

      英文錯誤為:Mailbox unavailable. The server response was: User has no permission.

     【其實用.Net傳送郵件時相當於自定義客戶端根據使用者名稱和密碼進行登入,然後使用SMTP服務傳送郵件。但新註冊的163郵件預設是不開啟客戶端授權驗證的,qq郵箱的也是需要手動開啟不然登入總是會被拒絕,驗證沒有許可權。解決辦法是進入相關郵箱去設定客戶端授權密碼,選擇開啟即可,如下截圖

 

         

         

   注意:最後,切忌設定完畢後,在程式碼中用使用客戶端授權密碼代替原始的郵箱密碼,這樣就可以正確的傳送郵件了。

 

        'GB2312' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

        上面是丟擲的異常資訊。我的解決方案是:將編碼格式統一改成了UTF-8。【使用UTF-8的一個好處是其他地區的使用者(如香港臺灣)無需安裝簡體中文支援就能正常觀看你的文字*而不會出現亂碼。*
         也在這補充一下gb2312是簡體中文的碼;gbk支援簡體中文及繁體中文;big5支援繁體中文;utf-8支援幾乎所有字元 】

    

1    MailMessage mailMessage = new MailMessage(fromAddress, toAddress);
2             mailMessage.Subject = "測試郵件";
3             mailMessage.Body = "einspect系統測試郵件密碼是否正確";
4             mailMessage.SubjectEncoding = Encoding.UTF8;
5             mailMessage.BodyEncoding = Encoding.UTF8;// Encoding.GetEncoding("GB2312");

 另外我再分享一個別人的處理方案,我嫌麻煩,想看的也可以看看,https://www.cnblogs.com/chr-wonder/p/8464204.html

  • 遇到的第三個坑,輸入發件人的賬號時,不是輸入郵箱的完整地址.(如:你的郵箱[email protected],那麼你的登入賬號通常就是abcd)

SmtpClient client = new SmtpClient()
            {
                Host = model.SmtpServer, //"smtp.qq.com";
                Port = 25, ////通過網路傳送到SMTP伺服器
                DeliveryMethod = SmtpDeliveryMethod.Network,
                //發件人登入郵箱的使用者名稱和密碼
                Credentials = new NetworkCredential(model.UserId, model.Password.Trim()) // 郵箱登入賬號 abcd ,密碼 qvkqkyiuebjhi
            };

 

   好了,整個過程分享完了,本人比較懶也覺得不太擅長寫東西,偶爾有興致就記錄一下吧,學習的路上總是痛苦漫長的,但過程結果會給你帶來快樂和成就感。讓我們一起成長吧,各路大神如發現錯誤請幫忙指正,我會虛心修改的,最後感謝不噴,18年就要結束了,讓我們用新的姿態去迎接新的一年吧!