使用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/
最新文章
- 分页控件layui的使用
- <;<;<; html图片背景平铺
- 《图形学》实验六:中点Bresenham算法画圆
- Web前端开发基础 第四课(颜色值)
- css3 3d效果及动画学习
- Reveal-Plugin-for-Xcode 自动结合 Reveal 进行 UI 分析
- Apache Common-pool2对象池分析和应用
- Unity3D 制作右上角小地图
- 转载ajax
- IOS 表视图(UITableVIew)的使用方法(3)名单的索引显示
- c++中string类型可以直接进行比较
- Redis笔记-Sentinel哨兵模式
- [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
- python学习(二)--数据类型
- 详解C#泛型(三)
- 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)
- 建立window SVN服务器
- CF989C A Mist of Florescence 构造
- SSM整合CRUD操作(一)
- Lintcode---将二叉树拆成链表