ASP.NET Core Library – MailKit SMTP Client
前言
以前写的 SMTP Client 相关文章:
Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 )
Email 关于 POP3 IMAP SMTP office365 Outlook Gmail G-Suit shared mailbox小小理解
.NET build-in 的 SMTP Client 已经废弃了. 官网已经给出告示:
它推荐是用 MailKit. MailKit 是一个功能齐全的 mail client library, 底层用的是 MimeKit 作者都是同一个人, 它可以实现 SMTP, POP3, IMAP 等功能.
如果只是想要 SMTP Client 功能, FluentEmail 也是一个不错的选择.
参考:
安装
dotnet add package MailKit
SmtpClient
using var client = new SmtpClient(); await client.ConnectAsync( host: "smtp.gmail.com", port: 587, options: MailKit.Security.SecureSocketOptions.StartTls ); await client.AuthenticateAsync("mygmail@gmail.com", "mypassword"); client.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13; // 这个是默认值
创建 SmtpClient 对象, 链接 SMTP Server, 输入 username, password. 就可以了
SslProtocols 默认就是 TLS1.2 | 1.3 了 (2022年 2 月起, smtp.office365.com 不再支持 TLS 1.0 和 1.1 了). 不需要特别设置.
提醒: Gmail / Outlook 开启 Two-factor 的话, mypassword 不可以使用 user password 哦, 需要改用 App Password,
参考:
Youtube – How to get a Google App Password (full tutorial) for Gmail
Docs – Using app passwords with apps that don't support two-step verification for Outlook
p.s. hotmail, outlook, office365 的 host 是 smtp.office365.com, port 那些是一样的
MimeMessage
var message = new MimeMessage(); message.From.Add(new MailboxAddress("My Name", "mygmail@gmail.com")); message.To.Add(new MailboxAddress("Hengkeat Yam", "hengkeat87@gmail.com")); message.ReplyTo.Add(new MailboxAddress("Keat Keat", "keatkeat87@live.com")); var builder = new BodyBuilder { HtmlBody = @" <!DOCTYPE html> <html lang=""en"" xmlns=""http://www.w3.org/1999/xhtml"" xmlns:o=""urn:schemas-microsoft-com:office:office""> <head> <meta charset=""UTF-8""> <meta name=""viewport"" content=""width=device-width,initial-scale=1""> <meta name=""x-apple-disable-message-reformatting""> <title></title> </head> <body style=""color:red""> test email only </body> </html>", TextBody = "Test Email Only" }; var rootPath = Path.Combine(AppContext.BaseDirectory, @"..\..\..\"); builder.Attachments.Add("tifa2.PNG", await File.ReadAllBytesAsync(Path.Combine(rootPath, "tifa2.PNG"))); message.Subject = "Test Email"; message.Body = builder.ToMessageBody();
创建一个 MimeMessage, 输入 from, to, cc, bcc, replyto, subject, body, attachments 就可以了. 都是一般发邮件会填入的资料.
最后 send, 完事.
await client.SendAsync(message); await client.DisconnectAsync(quit: true);