亚洲必赢手机越平台的.NET邮件协议MailKit组件解析。跨平台的.NET邮件协议MailKit组件解析。

by admin on 2018年10月5日

   发起的.NET
Core开源组织号召,进展的快慢是自身要好为未尝想到的,很多园友都积极参与(虽然有点人诚心砸场子,要是坐自家以前的宝脾气,这会该为我起住院了吧,不过幸而是少数,做相同宗事究竟有人说好,也有人说是用武汉讲话说“闹眼子”),.NET社区不是无愿意共享文化之人口,只是没一个总体与美好的生态环境,总之要国内的.NET发展更强。我于此想到一词话“我们想团结好开巨浪,但咱也心甘情愿做巨浪来袭前的小浪”。

   发起的.NET
Core开源组织号召,进展的快慢是自家自己也没想到的,很多园友都积极参与(虽然有点人诚心砸场子,要是为自先的宝脾气,这会该被自己自从住院了咔嚓,不过幸而是个别,做相同桩事究竟有人说好,也有人说是用武汉话说“闹眼子”),.NET社区不是从未有过愿意共享文化之口,只是没一个完与佳的生态环境,总之要国内的.NET发展更加强。我于这里想到一词话“我们期待团结可以举行巨浪,但我们为乐于做巨浪来袭前的小浪”。

 
 上面拉了(我及时口涉嫌正事前,都设拿部分聊的口舌,这个习惯改不丢掉了…)

 
 上面拉了(我随即口关系正事前,都设拿有聊的口舌,这个习惯改变不丢了…)

 
 项目被以这的通信,有直接发数到页面,也出以短信通知,也发我门今天介绍的邮件组件。我们今天底重点职责就是是教授一下发生一个.NET之免费开源之邮件组件MailKit。本文将仍然的咬合实例和零部件底层代码讲解一下系组件的文化。(项目招人的时光,我都见面咨询一样下.NET的底层原理,有一个大神问我这么产生啊含义为?我们为刻画不出.NET底层那样的优异处理方式,为何取了解这些,其实自己个人觉得,问底的原理,只是向为和好之处理局部顺序出现的问题,以及针对性程序编码的时光,选择最宜的法子提升性能,任何一样种方式都发优势以及劣势,.NET的类库代码也是这样,如果我们知道.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组件可以经过CancellationToken取消相应的操作,CancellationToken传播应取消操作的关照,一个之CancellationToken使线程,线程池工作类里面,或撤销合作任务之目标。过实例化CancellationTokenSource对象来创造取消令牌,该目标管理由其CancellationTokenSource.Token属性检索的吊销令牌。然后,将收回令牌传递及应收取消通知的肆意数量之线程,任务或操作。令牌不克用于启动取消。

  MailKit组件支持异步操作,在里编写的有关I/O异步操作的接近。

一.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组件可以经CancellationToken取消相应的操作,CancellationToken传播应取消操作的通告,一个底CancellationToken使线程,线程池工作列里面,或取消合作任务的目标。过实例化CancellationTokenSource对象来创造取消令牌,该对象管理起该CancellationTokenSource.Token属性检索的撤令牌。然后,将撤销令牌传递及应收取消通知之擅自数量之线程,任务还是操作。令牌不克用来启动取消。

  MailKit组件支持异步操作,在里边编写的有关I/O异步操作的接近。

二.MailKit实例:

   
上面介绍了MailKit组件的背景和特征,这里虽介绍一下Email组件底粗略以。

二.MailKit实例:

   
上面介绍了MailKit组件的背景以及特色,这里虽介绍一下Email组件底大概以。

  1.创造邮件方式:

 public void SentEmail(string path)
        {
            var message = new MimeMessage();
            //获取From标头中的地址列表,添加指定的地址
            message.From.Add(new MailboxAddress("Joey", "joey@friends.com"));
            //获取To头中的地址列表,添加指定的地址
            message.To.Add(new MailboxAddress("Alice", "alice@wonderland.com"));
            //获取或设置消息的主题
            message.Subject = "How you doin?";
            // 创建我们的消息文本,就像以前一样(除了不设置为message.Body)
            var body = new TextPart("plain")
            {
                Text = @"Hey Alice-- Joey"
            };
            // 为位于路径的文件创建图像附件
            var attachment = new MimePart("image", "gif")
            {
                ContentObject = new ContentObject(File.OpenRead(path), ContentEncoding.Default),
                ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
                ContentTransferEncoding = ContentEncoding.Base64,
                FileName = Path.GetFileName(path)
            };
            // 现在创建multipart / mixed容器来保存消息文本和图像附件
            var multipart = new Multipart("mixed")
            {
                body, attachment
            };
            // 现在将multipart / mixed设置为消息正文 
            message.Body = multipart;
        }

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

  1.创造邮件方式:

 public void SentEmail(string path)
        {
            var message = new MimeMessage();
            //获取From标头中的地址列表,添加指定的地址
            message.From.Add(new MailboxAddress("Joey", "joey@friends.com"));
            //获取To头中的地址列表,添加指定的地址
            message.To.Add(new MailboxAddress("Alice", "alice@wonderland.com"));
            //获取或设置消息的主题
            message.Subject = "How you doin?";
            // 创建我们的消息文本,就像以前一样(除了不设置为message.Body)
            var body = new TextPart("plain")
            {
                Text = @"Hey Alice-- Joey"
            };
            // 为位于路径的文件创建图像附件
            var attachment = new MimePart("image", "gif")
            {
                ContentObject = new ContentObject(File.OpenRead(path), ContentEncoding.Default),
                ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
                ContentTransferEncoding = ContentEncoding.Base64,
                FileName = Path.GetFileName(path)
            };
            // 现在创建multipart / mixed容器来保存消息文本和图像附件
            var multipart = new Multipart("mixed")
            {
                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类,这里就不再解析了。

    2.邮件信息的剖析:

var message = MimeMessage.Load(stream);

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

    3.邮件的接:

   public static void HandleMimeEntity(MimeEntity entity)
        {
            //MimeEntity转化为Multipart实体
            var 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部分的塑造结构。的 内容处置头是以给接客户端提供提醒为怎样有凡为显得作为消息体的等同片,并且完全在叫诠释为附件。另外两种方式立即相差就未开牵线了。

    3.邮件的收受:

   public static void HandleMimeEntity(MimeEntity entity)
        {
            //MimeEntity转化为Multipart实体
            var 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

三.MailKit核心对象解析

 
 上面介绍了Email的基本操作就未举行过多的介绍,在动用该零件时,较为的粗略。这里就是来探望该器件的类型结构以及局部中坚目标。类库结构发生如下图:

亚洲必赢手机 2

    1.MimeMessage.Load():

public static MimeMessage Load (ParserOptions options, Stream stream, bool persistent, 
                                CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            var parser = new MimeParser (options, stream, MimeFormat.Entity, persistent);

            return parser.ParseMessage (cancellationToken);
        }

   
 该办法从指定的流加载MimeMessage,具有6只措施重载。该法返回一个MimeMessage对象,有源码可以看看,在拖欠方式中创立了一个MimeParser对象,MimeParser包含内容(例如邮件正文文本或附件)的叶节点MIME部分。调用ParseMessage方法,解析来自流的音讯。

   2.TextPart.Text:

public string Text {
            get {
                if (ContentObject == null)
                    return string.Empty;
                var charset = ContentType.Parameters["charset"];
                using (var memory = new MemoryStream ()) {
                    ContentObject.DecodeTo (memory);
                    var content = memory.ToArray ();
                    Encoding encoding = null;
                    if (charset != null) {
                        try {
                            encoding = CharsetUtils.GetEncoding (charset);
                        } catch (NotSupportedException) {
                        }
                    }
                    if (encoding == null) {
                        try {
                            return CharsetUtils.UTF8.GetString (content, 0, (int) memory.Length);
                        } catch (DecoderFallbackException) {
                            encoding = CharsetUtils.Latin1;
                        }
                    }
                    return encoding.GetString (content, 0, (int) memory.Length);
                }
            }
            set {
                SetText (Encoding.UTF8, value);
            }
        }

   
该属性获取解码的文书内容。该属性是一个而读而写的性。ContentType.Parameters[“charset”]用以取charset参数的价值。该方法用来以参数的价设置为数量流并设置相应之编码。看到此的不得了处理组织,就想略的发话几句,.NET的挺比较的软弱,很多上以写.NET的好时便更是的简,以上是指向老知识捕获,有些地方并没举行拍卖,有些地方是对准大的地方开展还原。

    1.MimeMessage.Load():

public static MimeMessage Load (ParserOptions options, Stream stream, bool persistent, 
                                CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            var parser = new MimeParser (options, stream, MimeFormat.Entity, persistent);

            return parser.ParseMessage (cancellationToken);
        }

   
 该方法从指定的流加载MimeMessage,具有6独道重载。该办法返回一个MimeMessage对象,有源码可以看看,在该措施中创立了一个MimeParser对象,MimeParser包含内容(例如邮件正文文本或附件)的叶节点MIME部分。调用ParseMessage方法,解析来自流的音。

   2.TextPart.Text:

public string Text {
            get {
                if (ContentObject == null)
                    return string.Empty;
                var charset = ContentType.Parameters["charset"];
                using (var memory = new MemoryStream ()) {
                    ContentObject.DecodeTo (memory);
                    var content = memory.ToArray ();
                    Encoding encoding = null;
                    if (charset != null) {
                        try {
                            encoding = CharsetUtils.GetEncoding (charset);
                        } catch (NotSupportedException) {
                        }
                    }
                    if (encoding == null) {
                        try {
                            return CharsetUtils.UTF8.GetString (content, 0, (int) memory.Length);
                        } catch (DecoderFallbackException) {
                            encoding = CharsetUtils.Latin1;
                        }
                    }
                    return encoding.GetString (content, 0, (int) memory.Length);
                }
            }
            set {
                SetText (Encoding.UTF8, value);
            }
        }

   
该属性获取解码的文书内容。该属性是一个不过读而写的性能。ContentType.Parameters[“charset”]用来取charset参数的值。该方法用来用参数的价值设置为多少流并设置相应之编码。看到此的可怜处理组织,就想略的说话几句子,.NET的很比较的软弱,很多时光以写.NET的挺时便越发的简便,以上是指向怪知识捕获,有些地方并没开拍卖,有些地方是对准充分的地方进行还原。

   3.MimeEntity.WriteTo():

public virtual void WriteTo (FormatOptions options, Stream stream, bool contentOnly, 
                            CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            if (!contentOnly)
                Headers.WriteTo (options, stream, cancellationToken);
        }

   
该办法以MimeEntity写副到指定的多少流中,该法接受参数options格式选项。stream输出数据流,contentOnly判断是否可写。该方式定义也虚方法,在延续这个措施后,可以于子类种对拖欠办法进行重写。

   3.MimeEntity.WriteTo():

public virtual void WriteTo (FormatOptions options, Stream stream, bool contentOnly, 
                            CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            if (!contentOnly)
                Headers.WriteTo (options, stream, cancellationToken);
        }

   
该方式将MimeEntity写副到指定的多寡流中,该办法接受参数options格式选项。stream输出数据流,contentOnly判断是否可写。该措施定义也虚方法,在此起彼伏这方后,可以当子类种对拖欠办法开展重写。

四.总结

 
 本人觉得以品种支出被,如果引入了第三方组件,我们尽量引入组件的源码,这样我们本着任何组件的布局来一个认识,组件的实现方式我们吧得以开展周密了解,尤其是咱们当开展调剂之下愈加有因此,我们可逐一的拓展断点调试。以上是指向拖欠零件的一个概括介绍,有趣味之好错过深入之询问和上学。

四.总结

 
 本人认为在类型开支中,如果引入了第三在组件,我们尽量引入组件的源码,这样咱们针对所有组件的结构发生一个认识,组件的兑现方式我们啊可以展开细心了解,尤其是咱以拓展调节之事后越来越有因此,我们可以逐一的展开断点调试。以上是本着拖欠器件的一个略介绍,有趣味之可错过深入之摸底和学习。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图