跨平台的

   发起的.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的习性实际上与放线菌壮观素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地图