跨平台的.NET邮件协议Mail基特组件解析管理

   发起的.NET
Core开源协会号召,进展的速度是自家要好也平昔不想到的,很多园友都积极参与(即使有些人诚心诚意砸场子,假若以我在此以前的宝脾气,这会应该被自己打住院了呢,但是幸而是个别,做一件事总有人说好,也有人说是用台中话说“闹眼子”),.NET社区不是绝非愿意共享知识的人,只是没有一个总体和不错的生态环境,可想而知希望国内的.NET发展进一步强大。我在此间想到一句话“我们盼望自己可以做巨浪,但我们也愿意做巨浪来袭前的小浪”。

管理 1

 
 上边扯淡完毕(我这人干正事前,都要将有些拉扯的话,这些习惯改不掉了…)

【01】浅谈Google
Chrome浏览器(理论篇)

 
 项目中为了及时的通信,有直接发多少到页面,也有应用短信通告,也有我门前几日介绍的邮件组件。我们先天的机要任务就是教课一下有一个.NET的免费开源的邮件组件Mail基特。本文将仍然的重组实例和零部件底层代码讲解一下有关组件的学识。(项目招人的时候,我都会问一下.NET的平底原理,有一个大神问我如此有什么样含义吗?我们也写不出.NET底层这样的突出处理模式,为什么取驾驭这么些,其实自己个人认为,问底层的原理,只是向为了跟好的拍卖部分程序出现的题目,以及对先后编码的时候,接纳最合适的法门提高性能,任何一种格局都有优势和劣势,.NET的类库代码也是这样,倘若我们知道.NET的底层实现,大家在项目的需求实现时,可以依照.NET底层实现,选用合适的格局,以求性能最优)。

【02】浅谈Google
Chrome浏览器(操作篇)(上)

一.Mailkit组件概述

 
 项目中使用Email的操作机会相比较多,一般不怎么大一些的项目,都会使用到邮件操作那么些操作。对于.NET邮件操作的零部件和办法相比多,明日我们就介绍一款邮件操作的机件Mail基特,那多少个邮件组件是一个开源免费的,我们前日就来询问一下这些组件的特征。Mime基特意在通过尽可能接近地依照MIME规范来解决这些题材,同时还为程序员提供了一个相当容易使用的尖端API。

 
 组件的支撑的客户端类型相比较多,例如SMTP客户端、POP3客户端、IMAP客户端。该零件是一个跨平台的Email组件,该零件援助.NET
4.0,.NET 4.5,Xamarin.Android,Xamarin.iOS,Windows Phone
8.1之类平台。该零件提供了一个MIME解析器,组件具备的分析特性灵活、性能高、很好的处理千头万绪的破损的MIME格式化。Mime基特(Kit)的习性实际上与GMime异常。

   该零件在安全性的依旧相比较高的,处理安全的法门较多,SASL认证、帮助S /
MIME v3.2、扶助OpenPGP、补助DKIM签名等等情势。Mailkit组件能够经过CancellationToken裁撤相应的操作,CancellationToken传播应注销操作的通报,一个的CancellationToken使线程,线程池工作项目里面,或撤废合作任务的目的。过实例化CancellationTokenSource对象来创设撤消令牌,该目的管理从其CancellationTokenSource.Token属性检索的撤废令牌。然后,将注销令牌传递到相应接受撤消通告的任性数量的线程,任务或操作。令牌无法用来启动撤除。

  Mail基特组件协助异步操作,在其间编写的关于I/O异步操作的类。

【03】浅谈Google
Chrome浏览器(操作篇)(下)

二.MailKit实例:

   
下面介绍了Mail基特组件的背景和特征,这里就介绍一下Email组件的简易利用。

【04】浅谈ASP.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属性获取或安装音讯的正文。

【05】浅谈ASP.NET
MVC运行过程
    

    2.邮件音信的解析:

var message = MimeMessage.Load(stream);

 
 邮件的音信大家需要展开对应的解析,这里我们使用MimeMessage的Load方法,该方法从指定的流加载Mime基特(Kit).MimeMessage。另一个加载数据的法子,可以利用MimeParser类,这里就不再解析了。

【06】浅谈ASP.NET MVC
控制器
   

    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部分的树结构。的 内容处置头是为着给接受客户端提供指示以怎么样部分是为着显得作为新闻体的一部分,并且目的在于被演讲为附件。其余二种办法这离就不做牵线了。

【07】浅谈ASP.NET MVC
路由
   

三.Mail基特主旨对象解析

 
 下面介绍了Email的基本操作就不做过多的介绍,在使用该零件时,较为的简练。这里就来看望该器件的品类结构和部分要旨目的。类库结构有如下图:

管理 2

【08】浅谈ASP.NET MVC
视图
 

    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的不胜时就更加的粗略,以上是对分外知识捕获,有些地点并从未做处理,有些地点是对充裕的地点举行复原。

【09】浅谈ASP.NET MVC
视图与控制器传递数据

   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判断是否可写。该措施定义为虚方法,在继承此情势后,可以在子类种对该方法举行重写。

【10】浅谈jqGrid 在ASP.NET
MVC中增删改查
     

四.总结

 
 本人认为在类型支付中,假使引入了第三方组件,我们尽量引入组件的源码,这样大家对全体组件的布局有一个认识,组件的实现格局大家也得以举办密切精通,尤其是我们在进展调剂的未来越发有用,我们可以逐一的展开断点调试。以上是对该器件的一个简便介绍,有趣味的可以去深刻的打听和读书。

【11】浅谈ASP.NET
页面之间传值的两种办法

【12】浅谈缓存技术在ASP.NET中的运用 
     

【13】浅谈NuGet在VS中的运用 
    

【14】浅谈ASP.NET
程序发布过程
         
 

【15】浅谈数据表明和认证

【16】浅谈依赖注入

【17】浅谈HtmlHelper

【18】浅谈基于APS.NET身份验证

【19】浅谈ASP.NET MVC 模型

【20】浅谈ASP.NET MVC 单元测试

【21】浅谈ASP.NET MVC网络安全;

【22】浅谈ASP.NET MVC八大类扩充

【23】再谈ASP.NET MVC Routing

【24】浅谈ASP.NET 高级话题

【25】浅谈大型ASP.NET MVC项目(含DEMO)

【26】下一密密麻麻:ASP.NET WebAPI

管理 3

本篇作品虽不谈架构,可是Cache又是架设中不可或缺的一对,因而,在讲解Cache的还要,将会提及到一些架构知识,关于架构部分,读者可以毫不明白,或者直接跳过,

您只需关注Cache即可,具体的架构,会在继续作品中与大家享用。

一   为啥要在ASP.NET
项目中引入缓存

  1. 大家先来考虑一个题目,日常,面临高并发问题时,我们应当怎么处理?

下图为正常的拍卖思路和模式

 管理 4

2.为啥引入Cache呢?

       
我们了解,造成高并发的根本原因是大量读写的题目,一般地,对于一个系统,读总是比写多,如我们总是逛Tmall,京东,天猫,唯品会等,但我们并不一定买东西(买东西,即下单,下单的操作,对应DB的Write操作),缓存首要解决读的题材(当然,在晚期的篇章中,我会讲到消息队列MQ,也是一种缓存机制,其不仅解决读的题材,还缓解写的题目)。

       
很好,大家清楚缓存首要解决读的题目,那么,我们读的事物很多,是不是缓存所有读的始末吧?答案是否认的。缓存重要解决这个频繁访问,吃服务器资源,实时性要求比较低,不常更新的始末。

二   ASP.NET
缓存技术概述

 (一)ASP.NET缓存技术项目

在ASP.NET实际项目开支中,我们得以采用基本的两种缓存技术:页面缓存、局部页面和数量缓存

管理 5

 1.整页缓存

 
所谓整页缓存,指缓存整个页面,且设置刷新间隔时间,刷新间隔时间一般以秒为单位(缓存无法一体刷新,且刷新间隔不借助于外部事件);

 2.局部页面缓存

 
 所谓部分页面缓存,也叫局部页面缓存,指通过设定影响页面的参数,此时的缓存存储页面的两个本子,一般情况需要坚守参数值为这多少个页面版本设置索引;

 3.运用程序缓存

 
 所谓运用程序缓存,也叫数据缓存,指将急需大量服务器资源的对象存储在内存中,在ASP.NET中,由Cache类来落实(Cache类的各个实例对应切切实实的每个运用程序,

其生存期依赖于拔取程序的生存期,当然,如果系统重启或者断电,则另当别论。)

 (二)二级缓存技术

在ASP.NET一般的花色中,我们利用二级缓存就能够缓解服务器缓存问题了,如下为二级缓存的概况图。

 管理 6

1.何为一级缓存?

 
 一流缓存,指不借助于外部缓存的缓存,上图中的二级缓存去掉外部缓存部分即为一流缓存;

 2.组成:由Web服务器、数据库服务器和二级缓存系统结合;

 3.请求-处理流程:对于读数据,接纳从内向外的逐条:内部缓存=》外部缓存=》数据库

   
(1)第一次呼吁读数据:黄色的箭头表示第一次呼吁,从数据库服务器DB中收获数据,并将数据缓存在二级缓存系统中;

   
(2)非第一次呼吁读数据:先从二级缓存内部缓存中取数据彰显页面,如若没有数量,则去二级缓存外部缓存中取数据展现页面,若外部缓存中没有数据,则再去数据库服务器中取数据;

 管理 7

 (4)对于写多少,才有从外向内顺序:数据库=》外部缓存=》内部缓存(这样做的目标,首假若维护数据的一致性);

4.构成二级缓存系统的外部缓存系统,一般我们可选拔MongoDB,Redis,Mencached等;

5.基于SOA+Redis的的貌似系统架构(当然,本篇小说不谈架构,由此不会分析架构,但会在延续的小说中独立讲解架构)

 管理 8

 6.咋样保证数据的一致性?

 
对于读数据,接纳从内向外的顺序;对于写多少,拔取从外向内的相继;

 7.缓存的有效期?

   
我们以Memcached做表面缓存为例,对于ASP.NET内部缓存,我们会担心内存不够用,而对此Memcached,则足以绝不操心内存不够用的题目。

   
拔取二级缓存方案,Memcaches缓存与ASP.NET缓存都要拓展严加的治本和决定,因为Memcached工作在外围,直接对数据库中的数据举办读取,

且他的内存空间一般较大,故它的缓存数据有效期应该遵照缓存数据在行使中的实际缓存有效期来设定,不会惨遭内部不足而被放走的熏陶,而ASP.NET

缓存工作在内层,间接与使用程序中的数据进行互动,且ASP.NET框架对自我缓存的内存空间有所限制,缓存空间过大会影响整个运用的属性,为了在

平等的内存空间下缓存更多的数码,ASP.NET缓存的有效期应该小于或等于Memcached缓存的有效期,有效期具体多少长度期视内存空间和利用程序访问

频率的高低而定,ASP.NET对允许缓存数据的有效期之和不可以抢先其在Memcached中的有效期,这样才能达标缓存数据的一致性,七个缓存的协同工作

,可以对应用程序的访问速度带啦很大的升级换代。

(三)缓存涉及到的片段有关技能

缓存是一门技术,无法花较少的篇幅即可讲领悟,如下简要列举部分Cache相关的技能

管理 9

 

 1.Cahe维护

维护网络上的,本地的Cache;

2.路由政策

切实的路由策略要遵照Cache架构和计划来设定,大致讲解一下地面缓存路由政策

管理 10

 

3.替换算法

4.预取技术

5.Cache性能分析

借助于一些性能分析工具来分析,重要关心命中率/缓存对象大小之间关系

管理 11

 6.过期策略

理所当然设置过期间隙,一般以秒为单位;

7.数量一致性

保险主旨同步,读写多少的逐一等;

8.缓存级别

切切实实的级别,遵照具体的政工要求来设定;

9.Cache技术

磁盘缓存,存储器缓存,WWW服务器缓存等;

10.数额缓存技术

 客户端数据缓存,分布式数据缓存,集中式数据缓存等;

三   Cache在ASP.NET
MVC中的运用

(一)整页缓存

1.ASP.NET
MVC中有什么整页缓存?

 整页缓存是一种相比简单且常用的缓存形式,缓存这一个页面。在ASP.NET中,整页缓存一般包括控制器缓存,Action缓存,Web.config缓存等;

2.什么页面需要整页缓存?

 一般地,整页缓存页面具有“读取频繁,数据不常更新、编译时索要占用大量光阴和资源”等特色;

3.ASP.NET
MVC中整页缓存的语法格式

管理 12

 

4.例子

 (1)控制器缓存

控制器缓存指把缓存效能于控制器。

 PageCacheController.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     [OutputCache(Duration = 70)]
10     public class ControllerCacheController : Controller
11     {
12         // GET: Default
13         public ActionResult ControllerCache()
14         {
15             
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

PageCache.cshtml

1 @{
2     ViewBag.Title = "ControllerCache";
3 }
4 
5 <h2>ControllerCache</h2>
6 
7 <div>
8     ViewBag的值:@ViewBag.CurrentTime
9 </div>

Result:

管理 13

 

(2)Action缓存

Action缓存指把缓存效率于Action。控制措施缓存与控制器缓存原理差不多,只不过控制器缓存把缓存成效于控制器,控制器方法缓存把缓存成效于控制器方法。这里就不上课了。

(3)Web.config缓存

Web.config缓存,有点类似于大家将数据库连接字符串添加在配置文件一律,看看上面的代码,是否很熟练呢?

<connectionStrings>
    <add name="SqlserverConstr" connectionString="Server=IP;db=DataBaseName;uid=UserName;pwd=Password" providerName="System.Data.SqlClient" />
  </connectionStrings>

Web.config将急需缓存的Controller或Action提取抽象到布置文件中,其实就一定于大家应用数据库连接字符串,使用时,调用即可。

<system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name ="WebConfiCache" duration="70"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>

大家将下边的控制器缓存参数用Web.config来配置

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     //[OutputCache(Duration = 70)]
10     [OutputCache(CacheProfile = "WebConfiCache")]
11     public class ControllerCacheController : Controller
12     {
13         // GET: Default
14         public ActionResult ControllerCache()
15         {
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

分析:

其实一定简单,就当作数据库连接字符串来操作仍旧<appSetting>操作即可

管理 14

 (3)缓存看重

留住读者朋友们去研商,相比较简单。

(二)部分页面缓存

 部分页面缓存,也叫页面部分缓存,重要解决在页面缓存中需要平常实时更新的一有些内容。

 页面部分缓存就是缓存页面的一有些,而不是缓存整个页面,它适用于页面内一些部分或者需要改进的多少的气象,在常用页面部分缓存的技术下平日使用先将全方位页面缓存,然后再交替页面中不需要缓存的一对。(用AJAX局部刷新来通晓)

(三)运用程序缓存

采取程序缓存是用来囤积与利用程序有关的靶子,重要由Cache类来落实(命名空间System.Web.Caching),可以以编码的法门灵活地决定缓存的操作。

管理 15

四   版权区

  • 感谢您的读书,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少一些小说利用读书、参考、引用、抄袭、复制和粘贴等多种措施组成而成的,大部分为原创。
  • 如你喜欢,麻烦推荐一下;如你有新想法,欢迎指出,邮箱:2098469527@qq.com。
  • 可以转载该博客,但不可以不闻名博客来源。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注