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

.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)

    分享創造快樂