在 ASP.NET Core 中傳送郵件遇到的坑_學習筆記 使用GB2312編碼報錯的問題.
功能需求
因為專案需要有個忘記密碼驗證郵箱再重新修改密碼的功能,然後我選用了很簡單的一個方案,通過驗證登入使用者的郵箱然後傳送郵件,通過這個郵件傳送的連結地址來最後實現密碼修改的小功能。
專案環境及實現
網上有人說目前 .NET Core 還不支援 SMTP 協議,我使用的.net core 2.1這個版本還是可以的。但是1.0,1.1的舊版本是不行的,有興趣可以去試,我是從1.0升級上來才發現的...當然還可藉助於一些第三方元件來達到目的,具體可參考資料
簡單郵件傳送核心程式碼如下:
1 public RequestResult SendEmail(EmailModel model) 2 { 3 4 SmtpClient client = new SmtpClient() 5 { 6 Host = model.SmtpServer, //"smtp.qq.com"; 7Port = 25, 8 //通過網路傳送到SMTP伺服器 9 DeliveryMethod = SmtpDeliveryMethod.Network, 10 //發件人登入郵箱的使用者名稱和密碼 11 Credentials = new NetworkCredential(model.UserId, model.Password.Trim()) 12 }; 13 MailAddress fromAddress = newMailAddress(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編碼報錯的問題.
'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年就要結束了,讓我們用新的姿態去迎接新的一年吧!