Пример #1
0
        private static void FixEmailBody(EmailBody emailBody)
        {
            var htmlCharset = new Regex("\\<meta.*?charset=(?<charset>[a-zA-Z0-9\\-]*).*?\\>")
                                        .Match(emailBody.Content)
                                        .Groups["charset"]
                                        .Value;

            if (!string.IsNullOrEmpty(htmlCharset))
            {
                emailBody.Charset = htmlCharset;
                return;
            }

            var content = emailBody.Content;

            var meta = string.Format("<meta http-equiv=\"content-type\" content=\"text/html;charset={0}\"/>", emailBody.Charset);
            var bodyIndex = content.IndexOf("<body", 0, StringComparison.InvariantCultureIgnoreCase);
            var htmlIndex = content.IndexOf("<html", 0, StringComparison.InvariantCultureIgnoreCase);

            if (bodyIndex < 0)
            {
                content = string.Format("<body>\r\n{0}\r\n</body>", content);
            }

            var insertIndex = content.IndexOf("</head>", 0, StringComparison.InvariantCultureIgnoreCase);

            if (insertIndex < 0)
            {
                meta = string.Format("<head>\r\n{0}\r\n</head>", meta);
                insertIndex = content.IndexOf("<body", 0, StringComparison.InvariantCultureIgnoreCase);
            }
            content = content.Insert(insertIndex, meta);

            if (htmlIndex < 0)
            {
                content = string.Format("<html>\r\n{0}\r\n</html>", content);
            }

            emailBody.Content = content;
        }
Пример #2
0
        private static EmailBody ProcessMailPartsRecursively(string partBody, string boundary, int recursionLevel = 0)
        {
            if (string.IsNullOrEmpty(partBody) || string.IsNullOrEmpty(boundary)) return null;

            boundary = boundary.EscapeRegexpSpecialChars();
            var re = new Regex(string.Format(MailPartDividerPattern, boundary), RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var parts = re.Matches(partBody);
            var count = parts.Count;
            EmailBody result = null;

            for (var i = count - 1; i >= 0; i--)
            {
                var part = parts[i];
                var contentType = part.Value.GetHeaderValue("content-type");
                var headerCharset = part.Value.GetHeaderValue("content-type", "charset");

                if (IsMultipartContent(contentType))
                {
                    var subBoundary = part.Value.GetHeaderValue("content-type", "boundary");
                    result = ProcessMailPartsRecursively(part.Value, subBoundary, ++recursionLevel);
                }

                if (result != null)
                {
                    break;
                }

                if (!contentType.Equals(HtmlContentType, StringComparison.InvariantCultureIgnoreCase) && (i > 0 || recursionLevel != 0)) continue;

                var match = new Regex(MailPartDetailsPattern, RegexOptions.Singleline).Match(part.Value);

                result = new EmailBody
                {
                    Content = match.Value,
                    ContentType = contentType,
                    ContentEncoding = part.Value.GetHeaderValue("content-transfer-encoding"),
                    Charset = headerCharset
                };

                break;
            }
            return result;
        }