跨平台的

   发起的.NET
Core开源协会号召,进展的速度是自个儿自己也从没想到的,很多园友都积极加入(固然有点人由衷砸场子,若是以自作者原先的宝性格,那会相应被笔者打住院了吗,但是幸亏是少数,做一件事总有人说好,也有人说是用夏洛特话说“闹眼子”),.NET社区不是平素不愿意大利共产党享文化的人,只是没有一个完全和曼妙的生态环境,总而言之希望国内的.NET发展更为强大。小编在此间想到一句话“大家愿意团结能够做巨浪,但大家也愿意做巨浪来袭前的小浪”。

   发起的.NET
Core开源协会号召,进展的快慢是本人要好也尚未想到的,很多园友都积极参与(即使有个外人率真砸场子,借使以自身以前的宝脾性,那会相应被作者打住院了呢,然则幸好是少数,做一件事总有人说好,也有人说是用埃德蒙顿话说“闹眼子”),.NET社区不是从未有过愿意大利共产党享知识的人,只是没有贰个全体和优质的生态环境,可想而知希望国内的.NET发展更为强大。我在那里想到一句话“我们盼望团结能够做巨浪,但我们也甘愿做巨浪来袭前的小浪”。

 
 上边扯淡完成(作者那人干正事前,都要将一些摆龙门阵的话,那几个习惯改不掉了…)

 
 上边扯淡完结(笔者那人干正事前,都要将部分摆龙门阵的话,这么些习惯改不掉了…)

 
 项目中为了及时的通讯,有直接发多少到页面,也有应用短信通告,也有笔者门前天介绍的邮件组件。大家明日的首要义务正是上课一下有一个.NET的免费开源的邮件组件MailKit。本文将如故的结合实例和零部件底层代码讲解一下有关组件的学问。(项目招人的时候,作者都会问一下.NET的平底原理,有三个大神问小编那样有哪些意思吗?大家也写不出.NET底层那样的美丽处理格局,为啥取驾驭这么些,其实本身个人认为,问底层的规律,只是向为了跟好的处理局地主次出现的难点,以及对程序编码的时候,选取最合适的法门进步质量,任何一种办法都有优势和劣势,.NET的类库代码也是那般,假若我们知道.NET的平底达成,大家在类型的供给达成时,能够依照.NET底层完毕,选用适用的不二法门,以求品质最优)。

 
 项目中为了及时的通讯,有平昔发多少到页面,也有使用短信文告,也有笔者门后天牵线的邮件组件。大家今日的严重性任务正是教课一下有3个.NET的免费开源的邮件组件MailKit。本文将仍然的结缘实例和零部件底层代码讲解一下相关组件的知识。(项目招人的时候,小编都会问一下.NET的最底层原理,有七个大神问笔者这么有何样含义呢?大家也写不出.NET底层那样的精彩处理格局,为啥取了然那几个,其实自身个人觉得,问底层的法则,只是向为了跟好的拍卖部分先后出现的题材,以及对先后编码的时候,选取最合适的办法升高质量,任何一种方法都有优势和劣势,.NET的类库代码也是这么,假如咱们知道.NET的最底层完毕,我们在品种的急需达成时,能够根据.NET底层完结,选用适当的措施,以求质量最优)。

一.Mailkit组件概述

 
 项目中采取Email的操作机会相比较多,一般不怎么大学一年级点的品类,都会使用到邮件操作那叁个操作。对于.NET邮件操作的零件和措施相比较多,明天大家就介绍一款邮件操作的零部件MailKit,那些邮件组件是1个开源免费的,我们今后就来打听一下那3个组件的表征。MimeKit意在通过尽恐怕接近地依照MIME规范来缓解这一个难题,同时还为程序员提供了多少个格外不难使用的高档API。

 
 组件的援救的客户端类型比较多,例如SMTP客户端、POP3客户端、IMAP客户端。该器件是1个跨平台的Email组件,该器件协助.NET
4.0,.NET 4.5,Xamarin.Android,Xamarin.iOS,Windows Phone
8.1之类平台。该器件提供了叁个MIME解析器,组件具备的解析性格灵活、品质高、很好的处理千头万绪的破碎的MIME格式化。MimeKit的性质实际上与阿奇霉素ime分外。

   该零件在安全性的依旧比较高的,处理安全的法门较多,SASL认证、扶助S /
MIME v3.二 、支持OpenPGP、支持DKIM签名等等情势。Mailkit组件能够通过CancellationToken废除相应的操作,CancellationToken传播应注销操作的通报,1个的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之类平台。该零件提供了3个MIME解析器,组件具备的分析天性灵活、质量高、很好的处理千头万绪的破损的MIME格式化。MimeKit的质量实际上与核糖霉素ime格外。

   该器件在安全性的照旧相比较高的,处理平安的点子较多,SASL认证、援助S /
MIME v3.二 、辅助OpenPGP、帮忙DKIM签名等等方式。Mailkit组件能够经过CancellationToken撤废相应的操作,CancellationToken传播应打消操作的关照,3个的CancellationToken使线程,线程池工作项目里面,或吊销同盟职责的对象。超过实际例化CancellationTokenSource对象来成立撤除令牌,该指标管理从其CancellationTokenSource.Token属性检索的吊销令牌。然后,将撤除令牌传递到应该接收撤废通告的肆意数量的线程,职责或操作。令牌不能够用来运转撤废。

  MailKit组件扶助异步操作,在当中编写的关于I/O异步操作的类。

二.MailKit实例:

   
下面介绍了Mail基特组件的背景和特点,那里就介绍一下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;
        }

 
 调用该器件发送邮件和为邮件添加附属类小部件是比较不难的,第3步是实例化MimeMessage对象,对于该对象的剖析将在上面进行,获得MimeMessage对象后,钦点邮件的地址和大旨等等相关音讯。第3步实例化TextPart对象,为指标设定文本新闻。若须求问邮件创制文件的附属类小部件,能够动用MimePart对象,包含内容(如音信正文文本或)的叶节点MIME部分三个附属类小部件。第5步为开创的邮件主体和文件以及附属类小部件音信后,能够成立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部分2个附属类小部件。第伍步为创制的邮件主体和文书以及附属类小部件音信后,能够创设Multipart对象,创立邮件容器,用来装载文本音讯和附属类小部件。最终调用MimeMessage.body属性获取或设置新闻的正文。

    2.邮件音信的剖析:

var message = MimeMessage.Load(stream);

 
 邮件的新闻我们需求开展相应的剖析,那里大家选取MimeMessage的Load方法,该格局从钦赐的流加载MimeKit.MimeMessage。另三个加载数据的点子,能够行使MimeParser类,那里就不再解析了。

    2.邮件消息的分析:

var message = MimeMessage.Load(stream);

 
 邮件的新闻大家必要展开相应的分析,那里大家选取MimeMessage的Load方法,该办法从内定的流加载MimeKit.MimeMessage。另2个加载数据的办法,能够动用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;
        }

 
 以上是对吸收到的音信的2个遍历,选用递归遍历MIME结构。MIME是内容的树结构,很像1个文件系统。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;
        }

 
 以上是对收取到的消息的3个遍历,选择递归遍历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,具有多少个措施重载。该办法再次来到七个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,具有多少个艺术重载。该办法再次来到一个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判断是不是可写。该方法定义为虚方法,在后续此办法后,能够在子类种对该措施实行重写。

四.总结

 
 自身认为在类型支付中,假诺引入了第二方组件,大家尽量引入组件的源码,那样大家对任何组件的布局有二个认识,组件的落到实处际情况势大家也能够举办细致精通,尤其是大家在开始展览调节的之后进一步有用,大家能够逐一的拓展断点调节和测试。以上是对该零件的一个简单介绍,有趣味的能够去深刻的垂询和上学。

四.总结

 
 本人认为在项目支出中,假如引入了第1方组件,我们尽量引入组件的源码,那样大家对一切组件的布局有三个认识,组件的落成形式大家也得以开始展览精心了然,特别是大家在展开调剂的现在特别有用,大家能够逐一的进行断点调节和测试。以上是对该零件的三个总结介绍,有趣味的能够去深刻的询问和学习。

相关文章

admin

网站地图xml地图