前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core 使用MailKit发送电子邮件

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

作者头像
Edi Wang
发布2019-07-08 19:43:54
5.3K0
发布2019-07-08 19:43:54
举报
文章被收录于专栏:汪宇杰博客汪宇杰博客

发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复,或者文章被其他网站引用时向管理员发送邮件。那么在.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类型非常类似。比如添加主题和发件人:

代码语言:javascript
复制
var messageToSend = new MimeMessage
{
    Sender = new MailboxAddress("发件人姓名", "发件人Email地址"),
    Subject = "主题",
};

添加发件人信息和以前有所不同,MailKit居然支持多个发件人,所以From是一个集合类型,要通过Add方法来添加:

代码语言:javascript
复制
messageToSend.From.Add(new MailboxAddress("发件人姓名", "发件人邮箱账号名"));

邮件正文(Body属性)支持多种格式,最常用的是纯文本和HTML。需要用TextPart类来安排,TextPart的构造函数里可以指定正文格式,例如HTML:

代码语言:javascript
复制
messageToSend.Body = new TextPart(TextFormat.Html) { Text = bodyText };

或者纯文本

代码语言:javascript
复制
messageToSend.Body = new TextPart(TextFormat.Plain) { Text = bodyText };

添加收件人信息:

代码语言:javascript
复制
messageToSend.To.Add(new MailboxAddress("收件人Email地址"));

添加抄送(CC)信息:

代码语言:javascript
复制
messageToSend.Cc.Add(new MailboxAddress("抄送者Email地址"));

使用Outlook.com发送电子邮件

微软Office 365的outlook支持SMTP协议。

服务器地址:smtp-mail.outlook.com

端口:587

SSL:支持

以下代码演示了几个步骤:

  1. 注册邮件发送成功后的事件
  2. 连接服务器
  3. 验证账号
  4. 发送邮件
  5. 断开连接
代码语言:javascript
复制
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)中发送邮件的效果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 汪宇杰博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档