點選上方藍字關註“汪宇傑部落格”
傳送郵件通知的功能在各種系統裡都很常見。我的部落格也能在有新評論、新回覆,或者文章被其他網站取用時向管理員傳送郵件。那麼在.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)中傳送郵件的效果:
朋友會在“發現-看一看”看到你“在看”的內容