歡迎光臨
每天分享高質量文章

.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:支持

以下代碼演示了幾個步驟:

  1. 註冊郵件發送成功後的事件

  2. 連接服務器

  3. 驗證賬號

  4. 發送郵件

  5. 斷開連接

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)中發送郵件的效果:

    已同步到看一看
    赞(0)

    分享創造快樂