示例#1
0
        public void Load(Stream reader, bool headersOnly = false, int maxLength = 0)
        {
            _HeadersOnly = headersOnly;
            Headers      = null;
            Body         = null;

            if (headersOnly)
            {
                RawHeaders = reader.ReadToEnd(maxLength, _DefaultEncoding);
            }
            else
            {
                var entireMessage = reader.ReadToEnd(maxLength, _DefaultEncoding).Split('\n');
                var index         = 0;
                var headers       = entireMessage
                                    .TakeWhile((x, i) => x.Trim().Length > 0 && (index = i) >= 0);
                RawHeaders = String.Join(Environment.NewLine, headers);

                string boundary = Headers.GetBoundary();
                if (!string.IsNullOrEmpty(boundary))
                {
                    //else this is a multipart Mime Message
                    //using (var subreader = new StringReader(line + Environment.NewLine + reader.ReadToEnd()))
                    ParseMime(String.Join(Environment.NewLine, entireMessage.SkipWhile((x, i) => i <= index || x.Trim().Length == 0)), boundary);
                }
                else
                {
                    SetBody(String.Join(Environment.NewLine, entireMessage.SkipWhile((x, i) => i <= index || x.Trim().Length == 0)));
                }
            }

            if (string.IsNullOrWhiteSpace(Body) && AlternateViews.Count > 0)
            {
                var att = AlternateViews.FirstOrDefault(x => x.ContentType.Is("text/plain"));
                if (att == null)
                {
                    att = AlternateViews.FirstOrDefault(x => x.ContentType.Contains("html"));
                }

                if (att != null)
                {
                    Body = att.Body;
                    ContentTransferEncoding = att.Headers["Content-Transfer-Encoding"].RawValue;
                    ContentType             = att.Headers["Content-Type"].RawValue;
                }
            }

            Date      = Headers.GetDate();
            To        = Headers.GetAddresses("To").ToList();
            Cc        = Headers.GetAddresses("Cc").ToList();
            Bcc       = Headers.GetAddresses("Bcc").ToList();
            Sender    = Headers.GetAddresses("Sender").FirstOrDefault();
            ReplyTo   = Headers.GetAddresses("Reply-To").ToList();
            From      = Headers.GetAddresses("From").FirstOrDefault();
            MessageID = Headers["Message-ID"].RawValue;

            Importance = Headers.GetEnum <MailPriority>("Importance");
            Subject    = Headers["Subject"].RawValue;
        }
示例#2
0
        private string ParseBody()
        {
            var body = String.Join(Environment.NewLine, _message
                                   // skip the headers
                                   .SkipWhile((x, i) => x.Trim().Length > 0 && i >= 0)
                                   // skip the blanks after the headers
                                   .SkipWhile((x, i) => x.Trim().Length == 0));

            if (!string.IsNullOrEmpty(Boundary))
            {
                ParseMime(body, Boundary);
                if (AlternateViews.Count > 0)
                {
                    var att = AlternateViews.FirstOrDefault(x => x.ContentType.Is("text/plain")) ??
                              AlternateViews.FirstOrDefault(x => x.ContentType.Contains("html"));

                    if (att != null)
                    {
                        return(att.Body);
                    }
                }
            }
            else
            {
                if (ContentTransferEncoding.Is("quoted-printable"))
                {
                    return(Utilities.DecodeQuotedPrintable(body, _encoding));
                }
                if (ContentTransferEncoding.Is("base64")
                    //only decode the content if it is a text document
                    && ContentType.StartsWith("text/", StringComparison.OrdinalIgnoreCase))
                {
                    return(_encoding.GetString(Convert.FromBase64String(body)));
                }
                return(body);
            }
            return(String.Empty);
        }
示例#3
0
        public void Load(TextReader reader, bool headersOnly = false)
        {
            _HeadersOnly = headersOnly;
            Headers      = null;
            Body         = null;

            if (headersOnly)
            {
                RawHeaders = reader.ReadToEnd();
            }
            else
            {
                var    headers = new StringBuilder();
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Trim().Length == 0)
                    {
                        if (headers.Length == 0)
                        {
                            continue;
                        }
                        else
                        {
                            break;
                        }
                    }
                    headers.AppendLine(line);
                }
                RawHeaders = headers.ToString();

                string boundary = Headers.GetBoundary();
                if (!string.IsNullOrEmpty(boundary))
                {
                    //else this is a multipart Mime Message
                    using (var subreader = new StringReader(line + Environment.NewLine + reader.ReadToEnd()))
                        ParseMime(subreader, boundary);
                }
                else
                {
                    SetBody((line + Environment.NewLine + reader.ReadToEnd()).Trim());
                }
            }

            if (string.IsNullOrWhiteSpace(Body) && AlternateViews.Count > 0)
            {
                var att = AlternateViews.FirstOrDefault(x => x.ContentType.Is("text/plain"));
                if (att == null)
                {
                    att = AlternateViews.FirstOrDefault(x => x.ContentType.Contains("html"));
                }

                if (att != null)
                {
                    Body = att.Body;
                    ContentTransferEncoding = att.Headers["Content-Transfer-Encoding"].RawValue;
                    ContentType             = att.Headers["Content-Type"].RawValue;
                }
            }

            Date      = Headers.GetDate();
            To        = Headers.GetAddresses("To").ToList();
            Cc        = Headers.GetAddresses("Cc").ToList();
            Bcc       = Headers.GetAddresses("Bcc").ToList();
            Sender    = Headers.GetAddresses("Sender").FirstOrDefault();
            ReplyTo   = Headers.GetAddresses("Reply-To").ToList();
            From      = Headers.GetAddresses("From").FirstOrDefault();
            MessageID = Headers["Message-ID"].RawValue;

            Importance = Headers.GetEnum <MailPriority>("Importance");
            Subject    = Headers["Subject"].RawValue;
        }