.NET Core 使用MailKit发送电子邮件
點擊上方藍字關注“汪宇杰博客”
發送郵件通知的功能在各種系統里都很常見。我的博客也能在有新評論、新回復,或者文章被其他網站引用時向管理員發送郵件。那么在.NET?Core里,如何實現發送電子郵件呢?
準備工作
我的案例會利用微軟outlook.com的個人版郵箱作為發件賬號發送郵件,使用SMTP協議。但你也可以使用其他支持SMTP的郵箱系統來做實驗。anyway,首先就是,你得有一個郵箱賬號啦~
關于 MailKit
很多有經驗的.NET老程序員可能會說,發郵件有什么難的,十幾年前我們就能用.NET Framework自帶的SmtpClient發郵件了,并且.NET?Core也能用。為啥還要寫這篇文章?
但是,萬物皆有始有終,最近我突然發現,SmtpClient?已經被微軟標記為棄用:
并且微軟官方欽點了一個繼任者:MailKit,也就是本文要介紹的東西。
https://github.com/jstedfast/MailKit
這是一個基于MimeKit的跨平臺.NET郵件庫,支持IMAP、POP3、SMTP協議。它相比.NET自帶的SmtpClient,支持更廣泛的協議和更現代的電子郵件標準。因此微軟官方建議,SmtpClient只用來兼容老應用,如果開發新應用的話,直接使用MailKit。
并且,它是在MIT協議下開源的。意味著非常自由的使用,也可以由全世界的.NET開發者參與貢獻,一起維護和完善這個東西。
使用SMTP協議發送郵件
我得到這個好東西以后,第一步就是將使用SmtpClient的老代碼遷移到MailKit。因此,我的案例里只使用SMTP這一種協議來發郵件。
安裝包
首先,使用NuGet安裝MailKit:
Visual Studio
Install-Package MailKit
.NET Core CLI
dotnet add package MailKit
構建?MimeMessage
MimeMessage是MailKit里代表一封電子郵件的對象,它和.NET自帶的MailMessage類型非常類似。比如添加主題和發件人:
var messageToSend = new MimeMessage
{
? ? Sender = new MailboxAddress("發件人姓名", "發件人Email地址"),
? ? Subject = "主題",
};
添加發件人信息和以前有所不同,MailKit居然支持多個發件人,所以From是一個集合類型,要通過Add方法來添加:
messageToSend.From.Add(new MailboxAddress("發件人姓名", "發件人郵箱賬號名"));
郵件正文(Body屬性)支持多種格式,最常用的是純文本和HTML。需要用TextPart類來安排,TextPart的構造函數里可以指定正文格式,例如HTML:
messageToSend.Body = new TextPart(TextFormat.Html) { Text = bodyText };
或者純文本
messageToSend.Body = new TextPart(TextFormat.Plain) { Text = bodyText };
添加收件人信息:
messageToSend.To.Add(new MailboxAddress("收件人Email地址"));
添加抄送(CC)信息:
messageToSend.Cc.Add(new MailboxAddress("抄送者Email地址"));
使用Outlook.com發送電子郵件
微軟Office?365的outlook支持SMTP協議。
服務器地址:smtp-mail.outlook.com
端口:587
SSL:支持
以下代碼演示了幾個步驟:
注冊郵件發送成功后的事件
連接服務器
驗證賬號
發送郵件
斷開連接
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
{
? ? smtp.MessageSent += (sender, args) => { // args.Response };
? ? smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
? ? await smtp.ConnectAsync("smtp-mail.outlook.com", 587, SecureSocketOptions.StartTls);
? ? await smtp.AuthenticateAsync("賬號", "密碼");
? ? await smtp.SendAsync(messageToSend);
? ? await smtp.DisconnectAsync(true);
}
MessageSent事件里可以通過args參數,獲得服務器的響應信息,以便于記錄Log。
連接outlook.com的服務器需要設置為SecureSocketOptions.StartTls,不然會拒絕連接。對于其他服務器,可以試試?SecureSocketOptions.Auto
效果
以下是MailKit在我的博客系統使用的郵件庫(Edi.TemplateEmail)中發送郵件的效果:
總結
以上是生活随笔為你收集整理的.NET Core 使用MailKit发送电子邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员修神之路--问世间异步为何物?
- 下一篇: C#并行编程(6):线程同步面面观