使用MailKit发送邮件
MailKit的项目地址:https://github.com/jstedfast/MailKit
使用:
1 定义发送邮件所需要的model或者dto,该model可根据个人的需要进行修改
1 public class EmailRequest
2 {
3 /// <summary>
4 /// 邮件的发送者的邮箱
5 /// </summary>
6 [Required] public string From { get; set; }
7 /// <summary>
8 /// 邮件的发送者的邮箱登录密码或者授权码 这里用邮箱密码还是授权码视情况而定
9 /// </summary>
10 [Required] public string Password { get; set; }
11 /// <summary>
12 /// Smtp服务器
13 /// </summary>
14 [Required] public string SmtpServer { get; set; }
15 /// <summary>
16 /// Smtp服务器的端口
17 /// </summary>
18 [Required] public int SmtpPort { get; set; }
19 /// <summary>
20 /// 邮件发送者的昵称
21 /// </summary>
22 [Required] public string Nickname { get; set; }
23 /// <summary>
24 /// 邮件的接收者 的邮箱
25 /// </summary>
26 [Required]
27 public string ToAddress { get; set; }
28 /// <summary>
29 /// 邮件的文本消息 非必须
30 /// </summary>
31
32 public string TextBody { get; set; }
33 /// <summary>
34 /// 邮件中可以放html 请在这里传入组织好的html
35 /// </summary>
36 public string HtmlBody { get; set; }
37 /// <summary>
38 /// 邮件的主题
39 /// </summary>
40 [Required]
41 public string Subject { get; set; }
42 /// <summary>
43 /// 邮件的附件 数据格式是Attachment的集合 一个Attachment表示一个文件,可以添加多个文件
44 /// </summary>
45 public IEnumerable<Attachment> Attachments { get; set; }
46 }
2 邮件里可以传附件
附件的model如下:
1 /// <summary>
2 /// 邮件附件的定义
3 /// </summary>
4 public class Attachment
5 {
6 /// <summary>
7 /// 附件的文件名 包含文件的扩展名,如 商品导入.xlsx。 方便如qq邮箱下载附件的时候 自动附上xlsx扩展名
8 /// </summary>
9 public string FileName { get; set; }
10 /// <summary>
11 /// 文件的流
12 /// </summary>
13 public Stream File { get; set; }
14
15
16 }
3 创建一个发送邮件的interface并实现
3.1 interface
1 public interface IAppEmailService
2 {
3 /// <summary>
4 /// 发送简单 带有附件的邮件
5 /// </summary>
6 /// <param name="emailRequest"></param>
7 /// <returns></returns>
8 Task SendAsync(EmailRequest emailRequest);
9 }
3.2 实现
1 /// <inheritdoc />
2 public async Task SendAsync(EmailRequest emailRequest)
3 {
4 var message = new MimeMessage();
5 message.To.Add(new MailboxAddress(emailRequest.ToAddress, emailRequest.ToAddress));//收件人
6 message.From.Add(new MailboxAddress(emailRequest.Nickname, emailRequest.From));//发件人
7 message.Subject = emailRequest.Subject;
8
9 var builder = new BodyBuilder { TextBody = emailRequest.TextBody, HtmlBody = emailRequest.HtmlBody }; //
10
11
12 if (emailRequest.Attachments.Any())
13 {
14 foreach (var attachment in emailRequest.Attachments)
15 {
16 await builder.Attachments.AddAsync(attachment.FileName,attachment.File);
17 }
18 }
19
20
21 message.Body = builder.ToMessageBody();
22
23
24
25 using (var client = new MailKit.Net.Smtp.SmtpClient())
26 {
27 // client.MessageSent += (sender, args) => { };
28 // client.ServerCertificateValidationCallback = (s, c, h, e) => true;
29 await client.ConnectAsync(emailRequest.SmtpServer, emailRequest.SmtpPort,SecureSocketOptions.Auto);
30
31 // Note: since we don't have an OAuth2 token, disable
32 // the XOAUTH2 authentication mechanism.
33 client.AuthenticationMechanisms.Remove("XOAUTH2");
34
35 // Note: only needed if the SMTP server requires authentication
36 await client.AuthenticateAsync(emailRequest.From, emailRequest.Password);
37
38 await client.SendAsync(message);
39 await client.DisconnectAsync(true);
40 }
41 }
4 通过测试的几个邮箱平台
4.1 网易个人/VIP邮箱
准备工作:需要开启SMTP服务

该授权码对应 EmailRequest中的Password
网易个人邮箱/VIP邮箱的smtp地址:smtp.163.com
网易个人邮箱/VIP邮箱的smtp端口: 465
4.2 网易企业邮箱
网易企业邮箱不需要生成授权码,Password使用邮箱的登录密码即可
网易企业邮箱的smtp:smtp.ym.163.com
网易企业邮箱的smtp端口号:465
注意:网易企业邮箱的smtp不一定是smtp.ym.163.com,可以参考:https://qiye.163.com/help/client-profile.html
4.3 outlook个人邮箱
outlook个人邮箱smtp服务器是:smtp-mail.outlook.com
outlook个人邮箱smtp端口号是:587
Password是登录outlook邮箱的密码
4.4 QQ个人邮箱
QQ个人邮箱的流程类似网易个人邮箱,都需要生成授权码

QQ个人邮箱的smtp地址是:smtp.qq.com
QQ个人邮箱的smtp端口号是:465
QQ个人邮箱的Password是上面的申请的授权码
4.5 QQ企业邮箱
抱歉,由于手头没有QQ企业邮箱,所以没有测试。
5 结语
这篇随笔用的mailkit的版本是2.13.0,在.net framework 的老项目中使用是可以正常发送邮件的
mailkit还有许多设置选项和特性,本篇随笔只是涉及其中的一小部分,欲探索更多特性,还请参考项目的文档。
相关链接:https://www.thecodebuzz.com/mailkit-send-email-in-asp-net-core-3-1/
https://www.taithienbo.com/send-email-with-attachments-using-mailkit-for-net-core/
使用MailKit发送邮件的更多相关文章
- 使用 MimeKit 和 MailKit 发送邮件
MimeKit 给.NET 社区带来了一流的 MIME 解析器,它能处理复杂的各种Mime, 性能好.而且开箱即用支持 S/MIME 和 PGP.MimeKit 和 MailKit 支持最新的国际化的 ...
- 使用Volo.Abp.MailKit发送邮件
Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现. 邮箱配置 qq邮箱支持smtp功能,需要去申请开通.参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对 ...
- JFinal项目发送邮件——jfinal-mail-plugin
JFianl框架: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有 ...
- 使用MailKit收发邮件
.Net BCL库中对于邮件的支持只有SmtpClient一个,它只能进行简单的邮件的发送操作,并且不支持POP3和SMTP,无法接收邮件,用起来有诸多不便. 今天看到园子里有文章(使用 MimeKi ...
- Asp.Net Core 快速邮件队列设计与实现
发送邮件几乎是软件系统中必不可少的功能,在Asp.Net Core 中我们可以使用MailKit发送邮件,MailKit发送邮件比较简单,网上有许多可以参考的文章,但是应该注意附件名长度,和附件名不能 ...
- MailKit/MimeKit 发送邮件
MimeKit / MailKit 支持最新的国际化的电子邮件标准,是.NET 中为一个支持完整支持这些标准电子邮件库,最近正式发布了1.0版本.如果你想做所有与的电子邮件相关的事情,看看 MimeK ...
- 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题
在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...
- 在ASP.NET Core 1.0中如何发送邮件
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...
- .NET 通过SmtpClient发送邮件 提示 4.7.1 service unavailable try again later 解决办法
最近用C#的SmtpClient发送电子邮件碰到这个错误: 正在处理错误. 服务器响应为:4.7.1 Service unavailable - try again later 换了其他的SMTP服务 ...
- 跨平台的.NET邮件协议MailKit组件解析
发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...
随机推荐
- MyBatis_07(动态SQL)
动态SQL: Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能, 它存在的意义是:"为了解决拼接SQL语句字符串时的痛点问题". 一.If if标签可通 ...
- main(调用一个公共组件)
app.vue <template> <div> <Student/> <School></School> </div> < ...
- java annotation(如何创建新的注解)小结
"注解"有三种 1:无实际参数,只有声明 2:只存在单一参数,有些像方法调用 3:有多个参数 标准的"注解"就先不总结了. 想总结一下<如何创建自己的注解 ...
- Python——02.变量及标识符
变量概念: -- 字面量:与字面上显示值一致的量称作字面量,在程序中可直接使用字面量:abc,123, 我是XX,等等 -- 变量:变量可通过赋值保存字面量,变量是可变的,跟随赋值的字面量不同而变化 ...
- 04jsp(2)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- HttpClient常用的一些常识
HttpClient是目前我们通讯组件中最常见的一个Api了吧.至少从我目前接触到与外部系统通讯的话是这样的.下面我将我自己常用的一些知识总结一下. 因为本猿也是边写边总结,有啥不对的还望多多指出. ...
- 操作系统 Concurrency 并发
1. 线程和进程的区别 名称 执行点 地址空间 状态保存位置 进程 process 一个进程有多个线程,多个执行点 一个进程一个地址空间 Process Control Block 进程控制块 线程 ...
- Filter Pattern 2 (dubbo的实现方式)
前一篇FilterPattern的范式,基本和Tomcat实现的filter chain是一样的: 这里介绍一下我看完dubbo关于Filter Pattern的实现思路,自己抽象出来的代码,以及理解 ...
- R7-1 字符排队
R7-1 字符排队 分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 本题要求编写程序,将给定字符串中的字符,按照ASCII码顺序从小到大排序后输出. 输入格式: 输入是一个以回车结 ...
- 快速搭建maven私服仓库并配置
1.第一步,通过官方网站下载tar.gz包上传到服务器并解压 随后进入解压目录,并执行./bin/nexus start 此时可能会出现如下异常 处理这个问题很容易,找到bin下的nexus文件,vi ...