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; }
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); }
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; }