Asp.Net Core 快速邮件队列设计与实现

  • 时间:
  • 浏览:3
  • 来源:uu快3倍率_uu快3网游_单双计划

找不到亲们设计的邮件队列事实上还要了4个多多部分:

启动队列时创建了新的系统进程,因此 将系统进程句柄保存起来:

在转化附件时下面的代码用来处里附件名编码难题:

欢迎转载,不过要著名原作者和出处

4个辦法 ,入队、出队、队列剩余邮件数量、队列是是否是空,亲们对队列的基本需求而是而是。

不可能 MimeMessage比较简化,因此 附件的难题不易处里,很多很多亲们设计接口时单独封装MailBox简化了编程接口

这里,亲们的服务依赖于IMailQueueProvider,使用了其入队功能

在亲们这篇文章中,亲们实现的队列提供器是基于内存的,时候呢亲们还可不要能实现其它的基于其它存储模式的,比如数据库,内部内部结构持久性队列等等,另外基于内存的实现还要持久的,一旦系统进程崩溃。未发出的邮件就会boom因此 消失 XD...

你累似 相对比较简化,亲们先看下全部的类,再逐步解释:

这里,亲们要注意的是创建FileStream的时机,是在请求GetFileStream辦法 时,而还要构造函数中,不可能 创建FileStreamFileStream会占用文件,不可能 亲们发两封邮件使用了同4个多多附件,找不到会抛出异常。而写在GetFileStream辦法 中相对比较安全(除非发送器是并行的)

启动队列,停止队列,队列运行中状态,邮件计数

为什么在么在会么会,亲们的接口中找不到直接使用MimeMessage而是使用MailBox?

到此,亲们的邮件队列就完成了! :D

转换一共两步,1是主体转换,比较简单。二是附件的处里这里涉及到附件名中文编码的难题。

第一行将mailbox转加在 MailKit使用的MimeMessage实体,第二步切实的发送邮件

系统进程启动时运行了辦法 StartSendMail

代码如下:

嘴笨 写的不错句子帮忙点个赞撒 :D

很多很多,亲们还要处里你累似 难题,亲们的处里辦法 而是使用邮件队列来发送邮件

MailBox是对邮件的封装,不须简化,稍还要介绍到

你累似 辦法 不断的从队列读取邮件并发送,当 遇到异常,不可能 _tryStoptrue时老出 循环,此时系统进程时候时候刚开始 英语 ,注意亲们会让系统进程睡眠,在适当的前一天。

内存流附件实现要求在创建时传递4个多多 MemoryStream和附件名称,比较简单

运行系统进程亲们会看一遍控制台每隔3秒就会打出日志:

其中new MimeContent(fs)是创建的Content,fs是Stream,MimeContent的构造函数如下:

发送邮件几乎是软件系统中必不可少的功能,在Asp.Net Core 中亲们可不要能使用MailKit发送邮件,MailKit发送邮件比较简单,网上有因此 可不要能参考的文章,因此 应该注意附件名长度,和附件名不到老出 中文的难题,不可能 你遇到了而是的难题可不要能参考我前一天写的这篇博客Asp.Net Core MailKit 完美附件(中文名、长文件名)。

找不到亲们设计的邮件队列提供器接口如下:

Ok, 第一步而是规划亲们的邮件队列有什么

这里有4个多多不为什么在么在要注意的而是在发送前一天释放附件(非托管资源):

这里在host.Run()主机启动前一天,亲们获取了IMailQueueManager并启动队列(别忘了注册服务)。

代码如下:

到这了亲们的邮件队列就基本完成了,接下来而是在系统进程启动后,启动队列,找到 Program.cs文件,并稍作改写如下:

MailBox 如下:

对于你要发送邮件的组件不可能 代码部分来讲,只还要将邮件入队,这就足够了

一般状态附件是磁盘上的文件,不可能 内存流MemoryStream不可能 byte[]数据。附件还要实际的文件的流Stream和4个多多附件名,很多很多附件接口设计如下:

SleepInterval 是睡眠间隔,不可能 目前亲们实现的队列是系统进程内的独立系统进程,发送器会循环读取队列,当队列是空的前一天,亲们应该让系统进程休息一会,不然无限循环会消耗少量CPU资源

在发送邮件中最简化的而是附件了,不可能 附件体积大,往往还涉及非托管资源(累似 :文件),很多很多附件处里一定要小心,处里留下漏洞和bug。

现在,4个多多主要部分就设计好了,亲们先看下MailBox,接下来就去实现你累似 个多多接口

这上面没什么特殊的,亲们一看便能理解,除了IEnumerable<IAttachment> Attachments { get; set; }

很多很多亲们的设计的附件是基于Stream的。

在亲们简单搜索网络,并成功处里了附件的难题前一天,亲们不可能 要能发送邮件啦!不过而是难题显现出来——发送邮件太慢了,没错,在我使用QQ邮箱发送时,单封邮件发送相当于要用1.5秒左右,用户不可能 难以忍受请求占据 1.5秒的延迟。

接下来而是辦法 SendMail了:

因此 亲们还还要的而是 4个多多用于存储邮件的队列,不可能 叫队列提供器,总之亲们要将邮件存储起来。以及4个多多发送器,发送器不断的从队列中读取邮件并发送。还还要4个多多邮件写入工具,你要发送邮件的代码使用写入工具将邮件转储到队列中。

亲们得有4个多多邮件Options类,来存储邮件相关的选项

在构造函数中请求了另外4个多多服务,因此 初始化了SmtpClient(这是MailKit中的)

在MailKit中附件实际上是流Stream,累似 下面的代码:

发送邮件的核心代码不到两行:

本文的实现是4个多多 ConcurrentQueue

找不到亲们默认实现了两中附件类型 物理文件附件内存文件附件,byte[]数据可不要能轻松的转加在 内存流,很多很多找不到写你累似