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