当前位置:健康减肥瘦身 > 瘦身减肥 > NET邮件公约Mail基特组件剖析

NET邮件公约Mail基特组件剖析

文章作者:瘦身减肥 上传时间:2019-12-22

三.MailKit大旨对象深入分析

   上边介绍了Email的基本操作就不做过多的牵线,在应用该零零部件时,较为的简短。这里就来探视该器件的花色构造和大器晚成部分着力指标。类库结构好似下图:

图片 1

   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判别是或不是可写。该形式定义为虚方法,在再而三此方法后,能够在子类种对该办法开展重写。

    2.邮件消息的分析:

var message = MimeMessage.Load(stream);

   邮件的新闻大家必要开展对应的分析,这里大家利用MimeMessage的Load方法,该情势从钦定的流加载Mime基特.MimeMessage。另一个加载数据的措施,能够使用MimeParser类,这里就不再拆解解析了。

    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.成立邮件格局:

 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属性获取或设置音讯的正文。

   项目中为了及时的通讯,有一贯发多少到页面,也会有使用短信布告,也许有小编门前些天牵线的邮件组件。我们昨日的首要职务就是教课一下有一个.NET的免费开源的邮件组件MailKit。本文将还是的组合实例和组件底层代码疏解一下有关组件的学问。(项目让人的时候,笔者都会问一下.NET的最底层原理,有一个大神问我这么有何样意思吗?大家也写不出.NET底层那样的特出管理方式,为什么取精晓那一个,其实本人个人认为,问底层的准绳,只是向为了跟好的管理局地主次现身的主题材料,以致对程序编码的时候,选取最合适的方法升高性能,任何生机勃勃种艺术都有优势和短处,.NET的类库代码也是这般,假诺我们知道.NET的底部达成,我们在类型的需要实现时,能够根据.NET底层完成,选拔适当的秘技,以求品质最优)。

   发起的.NET Core开源协会号令,进展的快慢是本人本人也未曾想到的,超多园友都积极参加(就算有一些人率真砸场子,借使以自己原先的宝性情,这会应该被自个儿打住院了吧,可是幸亏是个别,做意气风发件事总有的人讲好,也是有一些人会说是用沈阳话说“闹眼子”),.NET社区不是未曾愿意大利共产党享知识的人,只是未有八个完全和完美的生态境况,简来讲之希望国内的.NET发展越来越强盛。笔者在那间想到一句话“大家意在团结能够做巨浪,但我们也愿意做巨浪来袭前的小浪”。

二.MailKit实例:

    上面介绍了MailKit组件的背景和天性,这里就介绍一下Email组件的简短利用。

生龙活虎.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格式化。Mime基特的品质实际上与庆大霉素ime万分。

   该构件在安全性的还是比较高的,管理平安的点子超级多,SASL认证、扶植S / MIME v3.2、扶植OpenPGP、扶植DKIM签字等等格局。Mailkit组件能够由此CancellationToken撤废相应的操作,CancellationToken传播应撤废操作的通报,八个的CancellationToken使线程,线程池工作项目里面,或废除合营义务的靶子。超过实际例化CancellationTokenSource对象来创制撤消令牌,该目的管理从其CancellationTokenSource.Token属性检索的裁撤令牌。然后,将吊销令牌传递到应有吸收接纳撤销公告的放肆数量的线程,职务或操作。令牌不可能用来运营裁撤。

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

四.总结

   本人感到在等级次序耗费中,倘诺引进了第三方组件,我们尽量引进组件的源码,那样大家对一切组件的社团有多个认知,组件的贯彻格局大家也足以拓宽细心了然,特别是我们在开展调理的之后更为有用,我们得以逐风流浪漫的拓宽断点调节和测验。以上是对该器件的一个粗略介绍,风乐趣的能够去深刻的刺探和读书。

    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部分的树构造。的 内容处置头是为了给选用客商端提供提示以什么样部分是为着显示作为音讯体的风华正茂局部,何况意在被演讲为附属类小零器件。其它二种艺术那离就不做牵线了。

   下边扯淡完结(作者那人干正事先,都要将部分拉拉扯扯的话,那一个习贯改不掉了...)

本文由健康减肥瘦身发布于瘦身减肥,转载请注明出处:NET邮件公约Mail基特组件剖析

关键词: