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/