发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复,或者文章被其他网站引用时向管理员发送邮件。那么在.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)中发送邮件的效果:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有