.NET Core 使用MailKit发送电子邮件

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复,或者文章被其他网站引用时向管理员发送邮件。那么在.NET Core里,如何实现发送电子邮件呢?

640?wx_fmt=gif

准备工作

我的案例会利用微软outlook.com的个人版邮箱作为发件账号发送邮件,使用SMTP协议。但你也可以使用其他支持SMTP的邮箱系统来做实验。anyway,首先就是,你得有一个邮箱账号啦~

关于 MailKit

很多有经验的.NET老程序员可能会说,发邮件有什么难的,十几年前我们就能用.NET Framework自带的SmtpClient发邮件了,并且.NET Core也能用。为啥还要写这篇文章?

但是,万物皆有始有终,最近我突然发现,SmtpClient 已经被微软标记为弃用:

640?wx_fmt=png 640?wx_fmt=png

并且微软官方钦点了一个继任者:MailKit,也就是本文要介绍的东西。

https://github.com/jstedfast/MailKit

这是一个基于MimeKit的跨平台.NET邮件库,支持IMAP、POP3、SMTP协议。它相比.NET自带的SmtpClient,支持更广泛的协议和更现代的电子邮件标准。因此微软官方建议,SmtpClient只用来兼容老应用,如果开发新应用的话,直接使用MailKit。

并且,它是在MIT协议下开源的。意味着非常自由的使用,也可以由全世界的.NET开发者参与贡献,一起维护和完善这个东西。

640?wx_fmt=gif

使用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)中发送邮件的效果:

640?wx_fmt=png 640?wx_fmt=png 640?wx_fmt=gif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 ASP.NET Core使用 MailKit 发送电子邮件,需要执行以下步骤: 1. 安装 MailKit 和 MimeKit NuGet 包。 2. 在 Startup.cs 文件中添加以下代码: ```csharp using MailKit.Net.Smtp; using MimeKit; public void ConfigureServices(IServiceCollection services) { // ... services.AddMailKit(optionBuilder => { optionBuilder.UseSmtp("smtp.gmail.com", 587); optionBuilder.EnableSsl = true; optionBuilder.AuthenticationOptions = AuthenticationOptions.DoNotAuthenticate; }); // ... } ``` 3. 在控制器或服务中注入 `IMailer` 接口。 ```csharp using MailKit.Net.Smtp; using MimeKit; public class MyController : Controller { private readonly IMailer _mailer; public MyController(IMailer mailer) { _mailer = mailer; } public async Task<IActionResult> SendEmail() { var message = new MimeMessage(); message.From.Add(new MailboxAddress("From Name", "from@example.com")); message.To.Add(new MailboxAddress("To Name", "to@example.com")); message.Subject = "Test Email"; message.Body = new TextPart("plain") { Text = "This is a test email." }; await _mailer.SendAsync(message); return Ok(); } } ``` 4. 通过 MailKit 发送电子邮件: ```csharp using MailKit.Net.Smtp; using MimeKit; public interface IMailer { Task SendAsync(MimeMessage message); } public class Mailer : IMailer { private readonly SmtpClient _smtpClient; public Mailer(SmtpClient smtpClient) { _smtpClient = smtpClient; } public async Task SendAsync(MimeMessage message) { await _smtpClient.SendAsync(message); } } ``` 现在,当执行 `SendEmail()` 方法时,将通过 MailKit 发送电子邮件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值