使用MailIKit发送邮件

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服务

使用MailIKit发送邮件

 

 

该授权码对应 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个人邮箱的流程类似网易个人邮箱,都需要生成授权码

使用MailIKit发送邮件

 

 

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/

 

上一篇:(转)Linux搭建gitlab


下一篇:jenkins发送邮件设置