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/

最新文章

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

热门文章

  1. Mint UI中的坑:datetime-picker在PC浏览器上可以显示弹出的日期选择,但是在手机上是空白
  2. QT4.8.6移植
  3. Cadence Allegro创建盲埋孔
  4. iOS 过滤字符串
  5. 关于import-route static 和default-route-advertise区别知识总结
  6. 第一个WCF程序(最小实现)
  7. CentOS7安装GLPI资产管理系统
  8. 把本地项目上传到github
  9. office365启动突然提示注册表错误,无法打开“规则”配置的解决方案
  10. httpclint的传值和访问https