/// <summary> /// Parses the MIME part. /// </summary> /// <param name="binaryData">The data.</param> /// <param name="message">The message to add the data</param> /// <param name="compact">removes the original content string from mime parts. To get the string later, use <see cref="MimePart.DecodeOriginalContent()"/></param> /// <returns></returns> public static MimePart ParseMimePart(byte[] binaryData, Message message, bool compact) { MimePart part = new MimePart(); part.ParentMessage = message; part.OriginalContent = binaryData.ToASCII(); //ASCII content for header parsing try { // Separate header and body. int headerEnd = Regex.Match(part.OriginalContent, @".(?=\r?\n\r?\n)").Index + 1; int bodyStart = Regex.Match(part.OriginalContent, @"(?<=\r?\n\r?\n).").Index; //TODO: remove this workaround if (bodyStart == 0) { int indexBody = part.OriginalContent.IndexOf("\r\n\r\n"); if (indexBody > 0) { bodyStart = indexBody; } } if (part.OriginalContent.Length >= headerEnd) { ParseHeaderFields(part, headerEnd); ParseBody(binaryData, part, bodyStart); // Build the part tree. // This is a container part. if (part.ContentType.Type.ToLower().Equals("multipart")) { ParseSubParts(ref part, message, compact); } // This is a nested message. else if (part.ContentType.Type.ToLower().Equals("message")) { // TODO: Create an interpreter to this. } // Other types. else { DecodePartBody(ref part); } if (compact) { part.OriginalContent = null; } BodyParsed?.Invoke(null, message); } } catch (Exception ex) { throw new ParsingException(ex.Message); } return(part); }
/// <summary> /// Parses the MIME part. /// </summary> /// <param name="binaryData">The data.</param> /// <param name="message">Message object to update</param> /// <returns></returns> public static MimePart ParseMimePart(byte[] binaryData, Message message) { var part = new MimePart { ParentMessage = message, OriginalContent = ToUtf8(binaryData) //UTF8 content for header parsing }; try { // Separate header and body. var headerEnd = Regex.Match(part.OriginalContent, @".(?=\r?\n\r?\n)").Index + 1; var bodyStart = Regex.Match(part.OriginalContent, @"(?<=\r?\n\r?\n).").Index; //TODO: remove this workaround if (bodyStart == 0) { var indexBody = part.OriginalContent.IndexOf("\r\n\r\n"); if (indexBody > 0) { bodyStart = indexBody; } } if (part.OriginalContent.Length >= headerEnd) { ParseHeaderFields(part, headerEnd); ParseBody(binaryData, part, bodyStart); // Build the part tree. // This is a container part. if (part.ContentType.Type.ToLower().Trim().Equals("multipart")) { ParseSubParts(ref part, message); } // This is a nested message. else if (part.ContentType.Type.ToLower().Trim().Equals("message")) { // TODO: Create an interpreter to this. } // Other types. else { DecodePartBody(ref part); } // Call event id BodyParsed is not null. BodyParsed?.Invoke(null, message); } } catch (Exception ex) { throw new ParsingException(ex.Message); } return(part); }