跨平台的.NET邮件协议MailKit组件解析 - 彭泽0902

      2020-09-17 07:32      HTML5

发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人说是用武汉话说“闹眼子”),.NET社区不是没有乐于共享知识的人,只是没有一个完整和良好的生态环境,总之希望国内的.NET发展越来越强大。我在这里想到一句话“我们希望自己可以做巨浪,但我们也甘愿做巨浪来袭前的小浪”。

上面扯淡完毕(我这人干正事前,都要将一些扯淡的话,这个习惯改不掉了...)

项目中为了及时的通信,有直接发数据到页面,也有利用短信通知,也有我门今天介绍的邮件组件。我们今天的主要任务就是讲解一下有一个.NET的免费开源的邮件组件MailKit。本文将一如既往的结合实例和组件底层代码讲解一下相关组件的知识。(项目招人的时候,我都会问一下.NET的底层原理,有一个大神问我这样有什么意义吗?我们也写不出.NET底层那样的优秀处理方式,为何取了解这些,其实我个人觉得,问底层的原理,只是向为了跟好的处理一些程序出现的问题,以及对程序编码的时候,选择最合适的方式提升性能,任何一种方式都有优势和劣势,.NET的类库代码也是如此,如果我们知道.NET的底层实现,我们在项目的需求实现时,可以根据.NET底层实现,选择合适的方式,以求性能最优)。

一.Mailkit组件概述

项目中使用Email的操作机会比较多,一般稍微大一点的项目,都会使用到邮件操作这一个操作。对于.NET邮件操作的组件和方式比较多,今天我们就介绍一款邮件操作的组件MailKit,这个邮件组件是一个开源免费的,我们现在就来了解一下这一个组件的特点。MimeKit旨在通过尽可能接近地遵循MIME规范来解决这个问题,同时还为程序员提供了一个非常容易使用的高级API。

组件的支持的客户端类型比较多,例如SMTP客户端、POP3客户端、IMAP客户端。该组件是一个跨平台的Email组件,该组件支持.NET 4.0,.NET 4.5,Xamarin.Android,Xamarin.iOS,Windows Phone 8.1等等平台。该组件提供了一个MIME解析器,组件具备的解析特性灵活、性能高、很好的处理各种各样的破碎的MIME格式化。MimeKit的性能实际上与GMime相当。

该组件在安全性的还是比较高的,处理安全的方式较多,SASL认证、支持S / MIME v3.2、支持OpenPGP、支持DKIM签名等等方式。Mailkit组件可以通过CancellationTokenSource.Token然后,将取消令牌传递到应该收到取消通知的任意数量的线程,任务或操作。令牌不能用于启动取消。

MailKit组件支持异步操作,在内部编写的有关I/O异步操作的类。

二.MailKit实例:

上面介绍了MailKit组件的背景和特点,这里就介绍一下Email组件的简单应用。

1.创建邮件方式:

public void SentEmail(string path){var message = new MimeMessage();//获取From标头中的地址列表,添加指定的地址message.From.Add(, ));//获取To头中的地址列表,添加指定的地址message.To.Add(, ));//获取或设置消息的主题message.Subject = ;body = ){Text = };attachment = , ){ContentObject = new ContentObject(File.OpenRead(path), ContentEncoding.Default),ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),ContentTransferEncoding = ContentEncoding.Base64,FileName = Path.GetFileName(path)};multipart = ){body, attachment};// 现在将multipart / mixed设置为消息正文 message.Body = multipart;}

调用该组件发送邮件和为邮件添加附件是比较简单的,第一步是实例化MimeMessage对象,对于该对象的解析将在下面进行,得到MimeMessage对象后,指定邮件的地址和主题等等相关信息。第二步实例化TextPart对象,为对象设定文本信息。若需要问邮件创建文件的附件,可以使用MimePart对象,包含内容(如消息正文文本或)的叶节点MIME部分一个附件。第四步为创建的邮件主体和文本以及附件信息后,可以创建Multipart对象,创建邮件容器,用来装载文本信息和附件。最后调用MimeMessage.body属性获取或设置消息的正文。

2.邮件信息的解析:

var message = MimeMessage.Load(stream);

邮件的信息我们需要进行对应的解析,这里我们使用MimeMessage的Load方法,该方法从指定的流加载MimeKit.MimeMessage。另一个加载数据的方式,可以使用MimeParser类,这里就不再解析了。

3.邮件的接收:

HandleMimeEntity(MimeEntity entity){multipart = entity as Multipart;if (multipart != null){for (int i = 0; i < multipart.Count; i++)HandleMimeEntity(multipart[i]);return;}var rfc822 = entity as MessagePart;if (rfc822 != null){var message = rfc822.Message;HandleMimeEntity(message.Body);return;}var part = (MimePart)entity;}

以上是对接收到的消息的一个遍历,采用递归遍历MIME结构。MIME是内容的树结构,很像一个文件系统。MIME确实定义了一组通用规则,用于邮件客户端如何解释MIME部分的树结构。

三.MailKit核心对象解析

上面介绍了Email的基本操作就不做过多的介绍,在使用该组件时,较为的简单。这里就来看看该组件的类型结构和一些核心对象。类库结构有如下图:

1.MimeMessage.Load():