苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 12992|回复: 0
打印 上一主题 下一主题

[Mime] MimeEntity--MimeEntity Mime实体帮助类

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-13 13:15:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
                         MimeEntity--MimeEntity Mime实体帮助类
导读部分
-------------------------------------------------------------------------------------------------------------
C#基类库苏飞版--系列教程导航 http://www.sufeinet.com/thread-655-1-1.html

下载之前你首先要注册成为会员哦,注册之后就可以直接下载啦
更新时间:2012-12-09
最新的MimeEntity类下载:
MimeEntity.rar (3.13 KB, 下载次数: 98)
这个类是关于Mime实体的类
看下面代码吧
[C#] 纯文本查看 复制代码
/// <summary>
/// 类说明:Assistant
/// 编 码 人:苏飞
/// 联系方式:361983679  
/// 更新网站:[url=http://www.sufeinet.com/thread-655-1-1.html]http://www.sufeinet.com/thread-655-1-1.html[/url]
/// </summary>
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.IO;
using System.Net.Mime;
using System.Net.Mail;

namespace DotNet.Utilities
{
    /// <summary>
    /// This class represents a Mime entity.
    /// 这个类表示一个MIME实体
    /// </summary>
    public class MimeEntity
    {
        private StringBuilder _encodedMessage;
        /// <summary>
        /// Gets the encoded message.
        /// 获取编码的消息。
        /// </summary>
        /// <value>
        /// 编码的消息
        /// The encoded message.
        /// </value>
        public StringBuilder EncodedMessage
        {
            get { return _encodedMessage; }
        }


        private List<MimeEntity> _children;

        /// <summary>
        /// Gets the children.
        /// </summary>
        /// <value>The children.</value>
        public List<MimeEntity> Children
        {
            get
            {
                return _children;
            }
        }

        private ContentType _contentType;
        /// <summary>
        /// Gets the type of the content.
        /// </summary>
        /// <value>The type of the content.</value>
        public ContentType ContentType
        {
            get { return _contentType; }
        }

        private string _mediaSubType;
        /// <summary>
        /// Gets the type of the media sub.
        /// </summary>
        /// <value>The type of the media sub.</value>
        public string MediaSubType
        {
            get { return _mediaSubType; }
        }

        private string _mediaMainType;
        /// <summary>
        /// Gets the type of the media main.
        /// </summary>
        /// <value>The type of the media main.</value>
        public string MediaMainType
        {
            get { return _mediaMainType; }
        }

        private NameValueCollection _headers;
        /// <summary>
        /// Gets the headers.
        /// </summary>
        /// <value>The headers.</value>
        public NameValueCollection Headers
        {
            get { return _headers; }
        }

        private string _mimeVersion;
        /// <summary>
        /// Gets or sets the MIME version.
        /// </summary>
        /// <value>The MIME version.</value>
        public string MimeVersion
        {
            get
            {
                return _mimeVersion;
            }
            set
            {
                _mimeVersion = value;
            }
        }

        private string _contentId;
        /// <summary>
        /// Gets or sets the content id.
        /// </summary>
        /// <value>The content id.</value>
        public string ContentId
        {
            get
            {
                return _contentId;
            }
            set
            {
                _contentId = value;
            }
        }

        private string _contentDescription;
        /// <summary>
        /// Gets or sets the content description.
        /// </summary>
        /// <value>The content description.</value>
        public string ContentDescription
        {
            get
            {
                return _contentDescription;
            }
            set
            {
                _contentDescription = value;
            }
        }

        private ContentDisposition _contentDisposition;
        /// <summary>
        /// Gets or sets the content disposition.
        /// </summary>
        /// <value>The content disposition.</value>
        public ContentDisposition ContentDisposition
        {
            get
            {
                return _contentDisposition;
            }
            set
            {
                _contentDisposition = value;
            }
        }

        private string _transferEncoding;
        /// <summary>
        /// Gets or sets the transfer encoding.
        /// </summary>
        /// <value>The transfer encoding.</value>
        public string TransferEncoding
        {
            get
            {
                return _transferEncoding;
            }
            set
            {
                _transferEncoding = value;
            }
        }

        private TransferEncoding _contentTransferEncoding;
        /// <summary>
        /// Gets or sets the content transfer encoding.
        /// </summary>
        /// <value>The content transfer encoding.</value>
        public TransferEncoding ContentTransferEncoding
        {
            get
            {
                return _contentTransferEncoding;
            }
            set
            {
                _contentTransferEncoding = value;
            }
        }

        /// <summary>
        /// Gets a value indicating whether this instance has boundary.
        /// </summary>
        /// <value>
        ///   <c>true</c> if this instance has boundary; otherwise, <c>false</c>.
        /// </value>
        internal bool HasBoundary
        {
            get
            {
                return (!string.IsNullOrEmpty(_contentType.Boundary))
                    || (!string.IsNullOrEmpty(_startBoundary));
            }
        }

        private string _startBoundary;
        /// <summary>
        /// Gets the start boundary.
        /// </summary>
        /// <value>The start boundary.</value>
        public string StartBoundary
        {
            get
            {
                if (string.IsNullOrEmpty(_startBoundary) || !string.IsNullOrEmpty(_contentType.Boundary))
                {
                    return string.Concat("--", _contentType.Boundary);
                }

                return _startBoundary;
            }
        }

        /// <summary>
        /// Gets the end boundary.
        /// </summary>
        /// <value>The end boundary.</value>
        public string EndBoundary
        {
            get
            {
                return string.Concat(StartBoundary, "--");
            }
        }

        private MimeEntity _parent;
        /// <summary>
        /// Gets or sets the parent.
        /// </summary>
        /// <value>The parent.</value>
        public MimeEntity Parent
        {
            get { return _parent; }
            set { _parent = value; }
        }

        private MemoryStream _content;

        /// <summary>
        /// Gets or sets the content.
        /// </summary>
        /// <value>The content.</value>
        public MemoryStream Content
        {
            get { return _content; }
            internal set { _content = value; }
        }


        /// <summary>
        /// Initializes a new instance of the <see cref="MimeEntity"/> class.
        /// </summary>
        public MimeEntity()
        {
            _children = new List<MimeEntity>();
            _headers = new NameValueCollection();
            _contentType = MimeReader.GetContentType(string.Empty);
            _parent = null;
            _encodedMessage = new StringBuilder();
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="MimeEntity"/> class.
        /// </summary>
        /// <param name="parent">The parent.</param>
        public MimeEntity(MimeEntity parent)
            : this()
        {
            if (parent == null)
            {
                throw new ArgumentNullException("parent");
            }

            _parent = parent;
            _startBoundary = parent.StartBoundary;
        }

        /// <summary>
        /// Sets the type of the content.
        /// </summary>
        /// <param name="contentType">Type of the content.</param>
        internal void SetContentType(ContentType contentType)
        {
            _contentType = contentType;
            _contentType.MediaType = MimeReader.GetMediaType(contentType.MediaType);
            _mediaMainType = MimeReader.GetMediaMainType(contentType.MediaType);
            _mediaSubType = MimeReader.GetMediaSubType(contentType.MediaType);
        }

        /// <summary>
        /// Toes the mail message ex.
        /// </summary>
        /// <returns></returns>
        public MailMessageEx ToMailMessageEx()
        {
            return ToMailMessageEx(this);
        }

        /// <summary>
        /// Toes the mail message ex.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <returns></returns>
        private MailMessageEx ToMailMessageEx(MimeEntity entity)
        {
            if (entity == null)
            {
                //throw new ArgumentNullException("entity");
                return null;
            }

            //parse standard headers and create base email.
            MailMessageEx message = MailMessageEx.CreateMailMessageFromEntity(entity);

            if (!string.IsNullOrEmpty(entity.ContentType.Boundary))
            {
                message = MailMessageEx.CreateMailMessageFromEntity(entity);
                BuildMultiPartMessage(entity, message);
            }//parse multipart message into sub parts.
            else if (string.Equals(entity.ContentType.MediaType, MediaTypes.MessageRfc822, StringComparison.InvariantCultureIgnoreCase))
            {
                //use the first child to create the multipart message.
                if (entity.Children.Count < 0)
                {
                    throw new Pop3Exception("Invalid child count on message/rfc822 entity.");
                }

                //create the mail message from the first child because it will
                //contain all of the mail headers.  The entity in this state
                //only contains simple content type headers indicating, disposition, type and description.
                //This means we can't create the mail message from this type as there is no 
                //internet mail headers attached to this entity.
                message = MailMessageEx.CreateMailMessageFromEntity(entity.Children[0]);
                BuildMultiPartMessage(entity, message);
            } //parse nested message.
            else
            {
                message = MailMessageEx.CreateMailMessageFromEntity(entity);
                BuildSinglePartMessage(entity, message);
            } //Create single part message.

            return message;
        }

        /// <summary>
        /// Builds the single part message.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <param name="message">The message.</param>
        private void BuildSinglePartMessage(MimeEntity entity, MailMessageEx message)
        {
            SetMessageBody(message, entity);
        }


        /// <summary>
        /// Gets the body encoding.
        /// </summary>
        /// <param name="contentType">Type of the content.</param>
        public Encoding GetEncoding()
        {
            if (string.IsNullOrEmpty(this.ContentType.CharSet))
            {
                return Encoding.ASCII;
            }
            else
            {
                try
                {
                    return Encoding.GetEncoding(this.ContentType.CharSet);
                }
                catch (ArgumentException)
                {
                    return Encoding.ASCII;
                }
            }
        }

        /// <summary>
        /// Builds the multi part message.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <param name="message">The message.</param>
        private void BuildMultiPartMessage(MimeEntity entity, MailMessageEx message)
        {
            foreach (MimeEntity child in entity.Children)
            {
                if (child == null)
                {
                    continue;
                }
                if (string.Equals(child.ContentType.MediaType, MediaTypes.MultipartAlternative, StringComparison.InvariantCultureIgnoreCase)
                    || string.Equals(child.ContentType.MediaType, MediaTypes.MultipartMixed, StringComparison.InvariantCultureIgnoreCase))
                {
                    BuildMultiPartMessage(child, message);
                }  //if the message is mulitpart/alternative or multipart/mixed then the entity will have children needing parsed.
                else if (!IsAttachment(child) &&
                    (string.Equals(child.ContentType.MediaType, MediaTypes.TextPlain)
                    || string.Equals(child.ContentType.MediaType, MediaTypes.TextHtml)))
                {
                    message.AlternateViews.Add(CreateAlternateView(child));
                    SetMessageBody(message, child);

                } //add the alternative views.
                else if (string.Equals(child.ContentType.MediaType, MediaTypes.MessageRfc822, StringComparison.InvariantCultureIgnoreCase)
                    && string.Equals(child.ContentDisposition.DispositionType, DispositionTypeNames.Attachment, StringComparison.InvariantCultureIgnoreCase))
                {
                    message.Children.Add(ToMailMessageEx(child));
                } //create a child message and 
                else if (IsAttachment(child))
                {
                    message.Attachments.Add(CreateAttachment(child));

                }
            }
        }

        private static bool IsAttachment(MimeEntity child)
        {
            return (child.ContentDisposition != null)
                && (string.Equals(child.ContentDisposition.DispositionType, DispositionTypeNames.Attachment, StringComparison.InvariantCultureIgnoreCase));
        }

        /// <summary>
        /// Sets the message body.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="child">The child.</param>
        private void SetMessageBody(MailMessageEx message, MimeEntity child)
        {
            Encoding encoding = child.GetEncoding();
            message.Body = DecodeBytes(child.Content.ToArray(), encoding);
            message.BodyEncoding = encoding;
            message.IsBodyHtml = string.Equals(MediaTypes.TextHtml,
                child.ContentType.MediaType, StringComparison.InvariantCultureIgnoreCase);
        }

        /// <summary>
        /// Decodes the bytes.
        /// </summary>
        /// <param name="buffer">The buffer.</param>
        /// <param name="encoding">The encoding.</param>
        /// <returns></returns>
        private string DecodeBytes(byte[] buffer, Encoding encoding)
        {
            if (buffer == null)
            {
                return null;
            }

            if (encoding == null)
            {
                encoding = Encoding.UTF7;
            }  //email defaults to 7bit.  

            return encoding.GetString(buffer);
        }

        /// <summary>
        /// Creates the alternate view.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <returns></returns>
        private AlternateView CreateAlternateView(MimeEntity view)
        {
            AlternateView alternateView = new AlternateView(view.Content, view.ContentType);
            alternateView.TransferEncoding = view.ContentTransferEncoding;
            alternateView.ContentId = TrimBrackets(view.ContentId);
            return alternateView;
        }

        /// <summary>
        /// Trims the brackets.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static string TrimBrackets(string value)
        {
            if (value == null)
            {
                return value;
            }

            if (value.StartsWith("<") && value.EndsWith(">"))
            {
                return value.Trim('<', '>');
            }

            return value;
        }

        /// <summary>
        /// Creates the attachment.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <returns></returns>
        private Attachment CreateAttachment(MimeEntity entity)
        {
            Attachment attachment = new Attachment(entity.Content, entity.ContentType);

            if (entity.ContentDisposition != null)
            {
                attachment.ContentDisposition.Parameters.Clear();
                foreach (string key in entity.ContentDisposition.Parameters.Keys)
                {
                    attachment.ContentDisposition.Parameters.Add(key, entity.ContentDisposition.Parameters[key]);
                }

                attachment.ContentDisposition.CreationDate = entity.ContentDisposition.CreationDate;
                attachment.ContentDisposition.DispositionType = entity.ContentDisposition.DispositionType;
                attachment.ContentDisposition.FileName = entity.ContentDisposition.FileName;
                attachment.ContentDisposition.Inline = entity.ContentDisposition.Inline;
                attachment.ContentDisposition.ModificationDate = entity.ContentDisposition.ModificationDate;
                attachment.ContentDisposition.ReadDate = entity.ContentDisposition.ReadDate;
                attachment.ContentDisposition.Size = entity.ContentDisposition.Size;
            }

            if (!string.IsNullOrEmpty(entity.ContentId))
            {
                attachment.ContentId = TrimBrackets(entity.ContentId);
            }

            attachment.TransferEncoding = entity.ContentTransferEncoding;

            return attachment;
        }
    }
}



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-9-18 21:45

© 2014-2021

快速回复 返回顶部 返回列表