NET邮件协议MailKit组件解析,NET邮件协议Mail基特(Kit)组件解析

   发起的.NET
Core开源协会号召,进展的快慢是本身要好也未曾想到的,很多园友都积极加入(就算有些人诚心砸场子,要是以本人往日的宝脾气,那会应该被我打住院了啊,然则幸而是少数,做一件事总有人说好,也有人说是用奥兰多话说“闹眼子”),.NET社区不是不曾愿意共享知识的人,只是没有一个完全和完美的生态环境,同理可得希望国内的.NET发展尤其强大。我在此间想到一句话“大家希望团结可以做巨浪,但大家也愿意做巨浪来袭前的小浪”。

   发起的.NET
Core开源协会号召,进展的快慢是自己自己也平素不想到的,很多园友都积极插足(尽管有点人由衷砸场子,如若以自己原先的宝脾气,那会相应被自己打住院了吗,可是幸而是个别,做一件事总有人说好,也有人说是用马普托话说“闹眼子”),.NET社区不是绝非愿意共享文化的人,只是没有一个完好和美妙的生态环境,可想而知希望国内的.NET发展更加强大。我在此处想到一句话“我们期待自己能够做巨浪,但大家也甘愿做巨浪来袭前的小浪”。

葡京会, 
 上边扯淡落成(我那人干正事前,都要将一部分闲话的话,那些习惯改不掉了…)

 
 上面扯淡落成(我那人干正事前,都要将一些闲话的话,那几个习惯改不掉了…)

 
 项目中为了及时的通信,有从来发多少到页面,也有使用短信布告,也有我门前几天牵线的邮件组件。大家前几天的重大职分就是上课一下有一个.NET的免费开源的邮件组件Mail基特(Kit)。本文将照旧的三结合实例和零部件底层代码讲解一下有关组件的学识。(项目招人的时候,我都会问一下.NET的平底原理,有一个大神问我那样有哪些意义呢?我们也写不出.NET底层那样的卓越处理情势,为啥取驾驭那些,其实我个人觉得,问底层的法则,只是向为了跟好的拍卖局部顺序出现的问题,以及对程序编码的时候,选用最合适的方法升高性能,任何一种方法都有优势和逆风局,.NET的类库代码也是如此,如果大家知道.NET的平底完结,大家在类型的需求完成时,能够依照.NET底层完成,接纳适当的艺术,以求性能最优)。

 
 项目中为了及时的通信,有间接发多少到页面,也有应用短信公告,也有我门前些天牵线的邮件组件。大家前日的严重性职务就是上课一下有一个.NET的免费开源的邮件组件Mail基特(Kit)。本文将依旧的组成实例和组件底层代码讲解一下有关组件的学识。(项目招人的时候,我都会问一下.NET的平底原理,有一个大神问我这么有哪些意思呢?大家也写不出.NET底层那样的理想处理形式,为啥取了然这个,其实自己个人觉得,问底层的法则,只是向为了跟好的拍卖部分程序出现的题材,以及对先后编码的时候,拔取最合适的章程提高性能,任何一种格局都有优势和逆风局,.NET的类库代码也是这样,借使我们知道.NET的底层落成,大家在项目标须要落成时,可以根据.NET底层落成,采纳适宜的方法,以求性能最优)。

一.Mailkit组件概述

 
 项目中行使Email的操作机会相比较多,一般不怎么大一些的档次,都会利用到邮件操作那几个操作。对于.NET邮件操作的零部件和形式相比多,前天我们就介绍一款邮件操作的组件Mail基特(Kit),那个邮件组件是一个开源免费的,大家现在就来打听一下那么些零部件的特点。Mime基特(Kit)目的在于通过尽可能接近地根据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属性检索的打消令牌。然后,将打消令牌传递到应有接收打消通告的人身自由数量的线程,职务或操作。令牌不可以用来启动撤消。

  Mail基特(Kit)组件援救异步操作,在其间编写的关于I/O异步操作的类。

一.Mailkit组件概述

 
 项目中采纳Email的操作机会相比多,一般不怎么大一点的项目,都会采取到邮件操作那一个操作。对于.NET邮件操作的组件和艺术相比较多,后天我们就介绍一款邮件操作的零部件MailKit,这一个邮件组件是一个开源免费的,我们现在就来打探一下这个组件的特性。Mime基特意在通过尽可能接近地根据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属性检索的打消令牌。然后,将收回令牌传递到相应接受取消布告的擅自数量的线程,职责或操作。令牌不可能用于启动打消。

  Mail基特组件扶助异步操作,在内部编写的有关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方法,该办法从指定的流加载Mime基特.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

三.Mail基特(Kit)宗旨对象解析

 
 上边介绍了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判断是否可写。该办法定义为虚方法,在两次三番此措施后,可以在子类种对该措施开展重写。

四.总结

 
 本人觉得在品种开发中,即使引入了第三方组件,大家尽量引入组件的源码,那样大家对任何组件的结构有一个认识,组件的兑现格局大家也足以展开细致明白,尤其是我们在举办调节的之后更加有用,我们得以逐一的开展断点调试。以上是对该器件的一个简单易行介绍,有趣味的可以去深入的打听和上学。

四.总结

 
 本人认为在类型支出中,若是引入了第三方组件,大家尽量引入组件的源码,这样我们对总体组件的结构有一个认识,组件的兑现格局大家也可以开展仔细了然,更加是大家在拓展调试的事后更为有用,我们得以逐一的进展断点调试。以上是对该零件的一个大约介绍,有趣味的可以去深远的通晓和学习。

相关文章

admin

网站地图xml地图