/// <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); }
/// <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()); }
/// <summary> /// Prevents a default instance of the <see cref="MimeReader"/> class from being created. /// </summary> private MimeReader() { this._entity = new MimeEntity(); }
/// <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; }
/// <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; }
/// <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); }
/// <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; }
/// <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; }
/// <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; }
/// <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); }
/// <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)); } } }
/// <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); }
/// <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]); }