使用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开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...
随机推荐
- shell - scriptfifo
shell1: mkfifo xxfifo script -f xxfifo cmd cmd exit -----主动退出 shell2: cat xxfifo 可以看到shell1的所有操作. ...
- TIDB-DM数据迁移第三部(集群管理)
1.对现在 dm 集群进行缩容,将 free 状态的 worker 下线. tiup dm display dm-test 查看 free 状态节点 tiup dm scale-in dm 172.1 ...
- lua-table类的继承
--男人类man = {name = "man",age=123}--继承空间man.__index=man--儿童类child= {}--继承setmetatable(child ...
- RecyclerView setHasFixedSize(true)
RecyclerView setHasFixedSize(true)当recycleview大小高宽不变的时候使用这个,可以提升效率
- WSL2安装了Ubuntu之后root不知道密码
更新了WSL2,安装完 Ubuntu 只要求新建账号和密码,不知道root密码,各种不方便Ubuntu 的默认 root 密码是随机的,即每次开机都有一个新的 root 密码在终端输入命令 sudo ...
- app对接微信支付(app支付)
(先补充一下,app唤醒微信支付失败的话,在确保没错的情况下,建议换一个手机或者重新下载微信,不知道是微信缓存还是什么原因) 1.先申请好开发环境 app支付不需要公众号,所以申请好开发商号和开发平台 ...
- 权昌TSC244条码打印机如何加载数据实现大批量打印呢?
我公司的TSC TTP-244条码打印机,只会改个名称打一张,怎么样改数据或者是加载数据实现大量打印的呢? 解答: TSC TTP-244条码打印机,是一款性能不错的桌面型条码打印机,最大打印 ...
- 单个表空间文件个数达到上限 ORA-01686
# 问题概述因在oracle数据库表空间管理中的时候 报 ORA-01686: max # files (1023) reached for the tablespace GPRS SQL> a ...
- c语言学习--静态函数
静态函数 #include<stdio.h> //这是静态函数, 静态函数只能在当前文件调用,其他文件下面的函数是没法调用到这个函数的 static void fun1() { print ...
- 85、使用Vue.js实现列表选中效果
实际项目中,我们会遇到很多类似的需求,一个列表,需要点击其中一条高亮显示.熟悉JQuery的同学说这个太简单了.可以给这个选中的element设置一个active的class.配合Css样式,让a ...