Example #1
0
        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;
        }
Example #2
0
        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);
        }
Example #3
0
        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;
        }
Example #4
0
        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;
        }
Example #5
0
        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;
        }
Example #6
0
        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;
        }
Example #7
0
 public MimeMessage(MimeHeaderCollection headers, IEnumerable<MimeMessage> subParts)
     : this(headers, null, subParts)
 {
 }
Example #8
0
 public MimeMessage(MimeHeaderCollection headers)
     : this(headers, null, new MimeMessage[] {})
 {
     this.MimeType = MimeType.TextPlain;
 }