邮件服务是一般的系统都会拥有和需要的功能,但是对于.Net项目来说,邮件服务的创建和使用会较为的麻烦。.NET对于邮件功能提供了System.Net.Mail用于创建邮件服务,该基础服务提供邮件的基础操作,并且使用也较为的简单。对于真正将该功能使用于项目的人,就会慢慢发现其中的优缺点,甚至有些时候不能忍受其中的问题。在这里介绍一种微软用于替代System.Net.Mail的邮件服务组件MailKit和MimeKit,官网地址:http://www.mimekit.net/ GitHub地址:https://github.com/jstedfast/MimeKit
MailKit和MimeKit基础概述
MailKit组件是一个免费开源的邮箱类库,简单来说MailKit帮我们封装了有关邮箱的一些帮助类,提供方法让我们更容易使用邮箱的SMTP、POP3、IMAP等协议。该组件是一个跨平台的Email组件,该组件支持.Net Core 、.Net FrameWork、Xamarin.Android、Xamarin.iOS、Windows Phone等等平台。
MimeKit提供了一个MIME解析器,组件具备的解析特性灵活、性能高、很好的处理各种各样的破碎的MIME格式化。MimeKit的性能实际上与GMime相当。
该组件在安全性的还是比较高的,处理安全的方式较多,SASL认证、支持S / MIME v3.2、支持OpenPGP、支持DKIM签名等等方式。Mailkit组件可以通过CancellationToken取消对应的操作,CancellationToken传播应取消操作的通知,一个的CancellationToken使线程,线程池工作项目之间,或取消合作任务的对象。过实例化CancellationTokenSource对象来创建取消令牌,该对象管理从其CancellationTokenSource.Token属性检索的取消令牌。然后,将取消令牌传递到应该收到取消通知的任意数量的线程,任务或操作。令牌不能用于启动取消。
MailKit组件支持异步操作,在内部编写的有关I/O异步操作的类
创建基础邮件服务
介绍过MailKit和MimeKit组建的基础信息,接下来就介绍一下如何使用两个组件的基本功能,在这里我将基本操作做了一个简单的封装,一般的项目可以直接引用封装好的类,大家可以根据实际的情况对该组件进行扩展。
基础实体类
邮件实体类
用于保存邮件至数据库
1 | public class MailBoxEntity : BaseEntity { |
邮箱发送服务器配置
此表用于保存邮箱的账号信息及不同邮箱服务器的SMTP端口等信息
当然,这些信息可以拆分成两个表存储。
1 | public class MailConfigEntity : BaseEntity { |
邮件发送结果信息
用于保存每一封邮件的发送状态,后续也可以关联其它业务表,与自动发送邮件任务配合,记录更多相关信息
1 | public class SendResultEntity : BaseEntity { |
邮件操作服务
配置基础信息
1 | /// <summary> |
发送邮件
Mailkit使用时会遇到“附件文件名不能为中文”和“附件文件名长度不能超过41字符”的Bug,这里我顺便参照网上的解决了
1 | /// <summary> |
收取邮件
这部分比较繁琐,先贴代码,然后再解释
1 | /// <summary> |
原本逻辑为初次仅拉取邮件头,用户点击详情后再拉取详情。收件速度可成倍提升
但目前客户需求在列表预览邮件部分内容,所以暂时选择全部拉取,后续可以改为仅拉取加载出邮件头的详情
其他操作
1 | /// <summary> |
组件使用感悟
MailKit和MimeKit组件在项目的使用中较为的便捷,基本包含了所有的基础邮件服务操作。组件提供的SmtpClient类提供的功能很丰富,例如连接邮件服务器,邮件账户认证,组装邮件消息,获取邮件服务器配置信息等等方法的提供,可以让我们在项目中快速的获取邮件服务的所有信息。
使用过邮件功能的项目 都会有困扰,客户端与邮件服务器的连接是否成功,以及邮件是否发送成功状态没有办法很快的获取,只能根据邮件服务器返回的一场状态进行判断。但是MailKit提供对应的方法和异常类,对邮件服务器返回的异常信息进行解析,客户端可以根据这些异常类获取邮件状态。
MailKit组件的提供了ProtocolLogger类,该类用于记录SMTP操作基础信息,该类作用为记录邮件服务日志。在邮件发送完毕后,需要及时的关闭连接,调用Disconnect(true)方法。