internal MimeMessage(MimeHeaderCollection headers, MemoryStream content, IEnumerable<MimeMessage> subParts) { if (headers == null) throw new ArgumentNullException("headers"); this.headers = headers; this.Content = content; this.subParts = new List<MimeMessage>(subParts); this.Format = MimeFormat.Standard; this.MimeType = MimeType.MultipartMixed; this.Charset = Charsets.ISO8859_1; this.Boundary = null; this.TransferEncoding = ContentTransferEncodingMethod.SevenBit; this.Disposition = MimeMessageDisposition.None; }
public static MimeNode Parse(string mimeData) { var fullMessage = Regex.Match(mimeData, MimeMessage.FullMessageMatch, RegexOptions.Singleline); if (!fullMessage.Success) throw new InvalidMimeMessageException("The message specified did not follow the format of a standard message.\nA message must consist of zero or more lines of headers, followed by a blank line, followed by zero or more lines in the body."); var header = fullMessage.Groups["header"].Value; var body = fullMessage.Groups["body"].Value; var headers = new MimeHeaderCollection(header); var contentTypeList = headers.GetHeaders("Content-type"); if (contentTypeList.Count == 1 && contentTypeList[0].IndexOf("multipart", StringComparison.OrdinalIgnoreCase) >= 0) return new MimeMultipartNode(header, body); return new MimeLeafNode(header, body); }
internal static MimeMessage Encode(MimeMessage message) { var encodedHeaders = new MimeHeaderCollection(); foreach (var header in message.Headers) { encodedHeaders.Add(Encode(header)); } var encodedMessage = new MimeMessage(encodedHeaders, message.Content, message.SubParts.ConvertAll<MimeMessage>(Encode)); encodedMessage.Format = message.Format; encodedMessage.Charset = message.Charset; encodedMessage.MimeType = message.MimeType; encodedMessage.Boundary = message.Boundary; encodedMessage.TransferEncoding = message.TransferEncoding; encodedMessage.Disposition = message.Disposition; return encodedMessage; }
private static MimeHeaderCollection Decode(MimeHeaderCollection headers) { var decodedHeaders = new MimeHeaderCollection(); foreach (var header in headers) { decodedHeaders.Add(new MimeHeader(header.Name, MimeEncoding.Decode(header.Value))); } return decodedHeaders; }
private static MimeMessage ParseBody(LineOrientedStream stream, MimeHeaderCollection headers) { var message = new MimeMessage(headers); ParseContentType(message); ParseContentTransferEncoding(message); ParseContentDisposition(message); // read and parse content MemoryStream contentStream; if (message.MimeType == null || !message.MimeType.TypeEquals("multipart")) { contentStream = new MemoryStream(1024); stream.CopyTo(contentStream, MimeFormat.Standard.Folding); message.Content = contentStream; return message; } // multipart/* var parts = new List<MimeMessage>(); var delimiter = new ByteString("--" + message.Boundary); var closeDelimiter = new ByteString("--" + message.Boundary + "--"); MemoryStream body = null; ByteString line = null; ByteString lastLine = null; contentStream = new MemoryStream(1024); for (;;) { if (lastLine != null) contentStream.Write(lastLine.ByteArray, 0, lastLine.Length); var l = stream.ReadLine(); if (l == null) break; lastLine = line; line = new ByteString(l); if (line.StartsWith(delimiter)) { if (lastLine != null) { if (lastLine.EndsWith(Octets.CRLF)) // CRLF "--" boundary contentStream.Write(lastLine.ByteArray, 0, lastLine.Length - 2); else // LF "--" boundary or CR "--" boundary contentStream.Write(lastLine.ByteArray, 0, lastLine.Length - 1); } contentStream.Position = 0; if (body == null) body = contentStream; else parts.Add(Parse(contentStream)); if (line.StartsWith(closeDelimiter)) break; else contentStream = new MemoryStream(1024); lastLine = null; } } message.Content = body; message.SubParts.AddRange(parts); return message; }
private static MimeHeaderCollection ParseHeader(LineOrientedStream stream) { var headers = new MimeHeaderCollection(); MimeHeader current = null; for (;;) { var lineBytes = stream.ReadLine(false); if (lineBytes == null) break; // unexpected end of stream var line = new ByteString(lineBytes); if (line.IsEmpty) break; // end of headers if (line[0] == Octets.HT || line[0] == Octets.SP) { // LWSP-char // folding if (current == null) // ignore incorrect formed header continue; current.Value += Chars.SP; current.Value += line.TrimStart().ToString(); } else { // field = field-name ":" [ field-body ] CRLF // field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":"> var delim = line.IndexOf(MimeHeader.NameBodyDelimiter); // ':' if (delim < 0) { // ignore incorrect formed header current = null; continue; } var header = new MimeHeader(line.Substring(0, delim).TrimEnd().ToString(), line.Substring(delim + 1).TrimStart().ToString()); headers.Add(header); current = header; } } return headers; }
public MimeMessage(MimeHeaderCollection headers, IEnumerable<MimeMessage> subParts) : this(headers, null, subParts) { }
public MimeMessage(MimeHeaderCollection headers) : this(headers, null, new MimeMessage[] {}) { this.MimeType = MimeType.TextPlain; }