Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }