This class represents a Mime entity.
コード例 #1
0
ファイル: MimeReader.cs プロジェクト: wiggle/papercut-web
        /// <summary>
        /// Initializes a new instance of the <see cref="MimeReader"/> class. 
        /// </summary>
        /// <param name="entity">
        /// The entity. 
        /// </param>
        /// <param name="lines">
        /// The lines. 
        /// </param>
        private MimeReader(MimeEntity entity, Queue<string> lines)
            : this()
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            if (lines == null)
            {
                throw new ArgumentNullException("lines");
            }

            this._lines = lines;
            this._entity = new MimeEntity(entity);
        }
コード例 #2
0
ファイル: MimeReader.cs プロジェクト: wiggle/papercut-web
        /// <summary>
        /// Adds the child entity.
        /// </summary>
        /// <param name="entity">
        /// The entity. 
        /// </param>
        /// <param name="lines">
        /// The lines. 
        /// </param>
        private void AddChildEntity(MimeEntity entity, Queue<string> lines)
        {
            /*if (entity == null)
            {
                    return;
            }

            if (lines == null)
            {
                    return;
            }*/
            var reader = new MimeReader(entity, lines);
            entity.Children.Add(reader.CreateMimeEntity());
        }
コード例 #3
0
ファイル: MimeReader.cs プロジェクト: wiggle/papercut-web
 /// <summary>
 /// Prevents a default instance of the <see cref="MimeReader"/> class from being created. 
 /// </summary>
 private MimeReader()
 {
     this._entity = new MimeEntity();
 }
コード例 #4
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
        /// <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");
            }

            this.Parent = parent;
            this._startBoundary = parent.StartBoundary;
        }
コード例 #5
0
ファイル: MailMessageEx.cs プロジェクト: seif/papercut-web
        /// <summary>
        /// Creates the mail message from entity.
        /// </summary>
        /// <param name="entity">
        /// The entity. 
        /// </param>
        /// <returns>
        /// </returns>
        public static MailMessageEx CreateMailMessageFromEntity(MimeEntity entity)
        {
            var message = new MailMessageEx();

            foreach (string key in entity.Headers.AllKeys)
            {
                string value = entity.Headers[key];
                if (value.Equals(string.Empty))
                {
                    value = " ";
                }

                message.Headers.Add(key.ToLowerInvariant(), value);

                switch (key.ToLowerInvariant())
                {
                    case MailHeaders.Bcc:
                        PopulateAddressList(value, message.Bcc);
                        break;
                    case MailHeaders.Cc:
                        PopulateAddressList(value, message.CC);
                        break;
                    case MailHeaders.From:
                        MailAddress fromAddress;
                        if (TryParseMailAddress(value, out fromAddress))
                        {
                            message.From = fromAddress;
                        }
                        break;
                    case MailHeaders.ReplyTo:
                        PopulateAddressList(value, message.ReplyToList);
                        break;
                    case MailHeaders.Subject:
                        message.Subject = DecodeIfEncoded(value);
                        break;
                    case MailHeaders.To:
                        PopulateAddressList(value, message.To);
                        break;
                }
            }

            return message;
        }
コード例 #6
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
 /// <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 = this.DecodeBytes(child.Content.ToArray(), encoding);
     message.BodyEncoding = encoding;
     message.IsBodyHtml = string.Equals(
         MediaTypes.TextHtml, child.ContentType.MediaType, StringComparison.InvariantCultureIgnoreCase);
 }
コード例 #7
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
        /// <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");
            }

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

            if (!string.IsNullOrEmpty(entity.ContentType.Boundary))
            {
                message = MailMessageEx.CreateMailMessageFromEntity(entity);
                this.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 Exception("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]);
                this.BuildMultiPartMessage(entity, message);
            }

                // parse nested message.
            else
            {
                message = MailMessageEx.CreateMailMessageFromEntity(entity);
                this.BuildSinglePartMessage(entity, message);
            }

            // Create single part message.
            return message;
        }
コード例 #8
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
 /// <summary>
 /// Creates the alternate view.
 /// </summary>
 /// <param name="view">
 /// The view. 
 /// </param>
 /// <returns>
 /// </returns>
 private AlternateView CreateAlternateView(MimeEntity view)
 {
     var alternateView = new AlternateView(view.Content, view.ContentType);
     alternateView.TransferEncoding = view.ContentTransferEncoding;
     alternateView.ContentId = TrimBrackets(view.ContentId);
     return alternateView;
 }
コード例 #9
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
        /// <summary>
        /// Creates the attachment.
        /// </summary>
        /// <param name="entity">
        /// The entity. 
        /// </param>
        /// <returns>
        /// </returns>
        private Attachment CreateAttachment(MimeEntity entity)
        {
            var 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;
        }
コード例 #10
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
 /// <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)
 {
     this.SetMessageBody(message, entity);
 }
コード例 #11
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
        /// <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 (string.Equals(
                    child.ContentType.MediaType, MediaTypes.MultipartAlternative, StringComparison.InvariantCultureIgnoreCase)
                    ||
                    string.Equals(
                        child.ContentType.MediaType, MediaTypes.MultipartMixed, StringComparison.InvariantCultureIgnoreCase)
                    ||
                    string.Equals(
                        child.ContentType.MediaType, MediaTypes.MultipartRelated, StringComparison.InvariantCultureIgnoreCase))
                {
                    this.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(this.CreateAlternateView(child));
                    this.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(this.ToMailMessageEx(child));
                }

                    // create a child message and
                else if (IsAttachment(child))
                {
                    message.Attachments.Add(this.CreateAttachment(child));
                }
                else if (string.Equals(
                    entity.ContentType.MediaType, MediaTypes.MultipartRelated, StringComparison.InvariantCultureIgnoreCase)
                         ||
                         string.Equals(
                         	entity.ContentType.MediaType, MediaTypes.MultipartMixed, StringComparison.InvariantCultureIgnoreCase))
                {
                    message.Attachments.Add(this.CreateAttachment(child));
                }
            }
        }
コード例 #12
0
ファイル: MimeEntity.cs プロジェクト: seif/papercut-web
 /// <summary>
 /// The is attachment.
 /// </summary>
 /// <param name="child">
 /// The child. 
 /// </param>
 /// <returns>
 /// The is attachment. 
 /// </returns>
 private static bool IsAttachment(MimeEntity child)
 {
     return (child.ContentDisposition != null)
            &&
            string.Equals(
            	child.ContentDisposition.DispositionType,
            	DispositionTypeNames.Attachment,
            	StringComparison.InvariantCultureIgnoreCase);
 }
コード例 #13
0
 /// <summary>
 /// The get header.
 /// </summary>
 /// <param name="header">
 /// The header.
 /// </param>
 /// <param name="stripBrackets">
 /// The strip brackets.
 /// </param>
 /// <returns>
 /// The get header.
 /// </returns>
 private string GetHeader(string header, bool stripBrackets = false)
 {
     return(stripBrackets ? MimeEntity.TrimBrackets(this.Headers[header]) : this.Headers[header]);
 }
コード例 #14
0
ファイル: MimeReader.cs プロジェクト: seif/papercut-web
 /// <summary>
 /// Prevents a default instance of the <see cref="MimeReader"/> class from being created.
 /// </summary>
 private MimeReader()
 {
     this._entity = new MimeEntity();
 }