NET邮件公约MailKit组件深入分析大红鹰葡京会

   发起的.NET
Core开源协会号召,进展的快慢是自家本人也并未有想到的,相当多园友都积极参加(即使有一点点人潜心贯注砸场子,若是以自己原先的宝性格,那会应该被本身打住院了吗,不过幸好是个别,做豆蔻梢头件事总有的人说好,也可以有些人会说是用奥兰多话说“闹眼子”),.NET社区不是绝非愿意大利共产党享知识的人,只是未有三个完全和大好的生态蒙受,总来讲之希望本国的.NET发展进一步强大。作者在这里地想到一句话“大家目的在于本人能够做巨浪,但我们也心甘情愿做巨浪来袭前的小浪”。

 
 上边扯淡完结(小编那人干正事前,都要将部分闲话的话,那个习于旧贯改不掉了…)

 
 项目中为了及时的通讯,有一贯发多少到页面,也是有使用短信公告,也可能有小编门前几日牵线的邮件组件。大家后天的重大职务便是教学一下有七个.NET的免费开源的邮件组件MailKit。本文将长期以来的组成实例和组件底层代码解说一下有关组件的学问。(项目招人的时候,作者都会问一下.NET的最底层原理,有三个大神问笔者那样有怎么着意思吗?我们也写不出.NET底层这样的手不释卷管理形式,为啥取掌握这么些,其实本身个人感觉,问底层的规律,只是向为了跟好的管理局地程序出现的难点,以致对程序编码的时候,选拔最合适的不二等秘书诀提高品质,任何风姿罗曼蒂克种艺术都有优势和劣势,.NET的类库代码也是那般,假设大家知道.NET的尾部落成,大家在类型的供给实现时,能够遵照.NET底层完成,选取适当的点子,以求质量最优)。

蒸蒸日上.Mailkit组件概述

 
 项目中动用Email的操作机遇非常多,日常不怎么大学一年级些的门类,都会利用到邮件操作这叁个操作。对于.NET邮件操作的零件和方式很多,昨日大家就介绍大器晚成款邮件操作的零部件Mail基特,那些邮件组件是一个开源免费的,大家未来就来打听一下这三个零件的性状。MimeKit目的在于通过尽大概相近地根据MIME规范来缓慢解决这些难点,同期还为程序猿提供了一个特别轻巧使用的高端级API。

 
 组件的支撑的顾客端类型比较多,比方SMTP客户端、POP3客商端、IMAP客户端。该零件是二个跨平台的Email组件,该器件扶植.NET
4.0,.NET 4.5,Xamarin.Android,Xamarin.iOS,Windows Phone
8.1之类平台。该零件提供了贰个MIME深入分析器,组件具有的分析天性灵活、质量高、很好的处理目不暇接的破损的MIME格式化。MimeKit的属性实际上与克拉霉素ime十分。

   该零件在安全性的如故相比高的,管理平安的章程比较多,SASL认证、支持S /
MIME v3.2、援救OpenPGP、辅助DKIM签字等等格局。Mailkit组件能够因此CancellationToken撤废相应的操作,CancellationToken传播应撤消操作的通报,贰个的CancellationToken使线程,线程池工作类型里面,或收回协作职分的指标。超过实际例化CancellationTokenSource对象来成立撤消令牌,该对象管理从其CancellationTokenSource.Token属性检索的吊销令牌。然后,将注销令牌传递到应该接受取消通告的自由数量的线程,任务或操作。令牌无法用来运行撤除。

  MailKit组件援救异步操作,在中间编写的有关I/O异步操作的类。

二.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属性获取或安装新闻的正文。

    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部分的树结构。的 内容处置头是为着给接受客商端提供提示以什么部分是为着呈现作为音讯体的意气风发有的,况兼目的在于被讲授为附属类小部件。其他二种形式那离就不做牵线了。

三.MailKit大旨对象剖析

 
 上面介绍了Email的基本操作就不做过多的介绍,在行使该零件时,较为的简易。这里就来探视该器件的项目结议和部分基本指标。类库结构有如下图:

大红鹰葡京会 1

    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判定是还是不是可写。该办法定义为虚方法,在这里起彼伏此办法后,能够在子类种对该措施实行重写。

四.总结

 
 自身认为在项目支出中,假设引进了第三方组件,大家尽量引进组件的源码,那样我们对全体组件的布局有三个认知,组件的实现情势大家也得以开展周到理解,非常是我们在进展调养的将来特别有用,大家得以逐如日方升的开展断点调节和测量检验。以上是对该器件的三个简练介绍,风野趣的能够去深切的垂询和读书。

相关文章

admin

网站地图xml地图