private void Parse(ref MimeParser mp, MimeMultipartBody parentMultipartBody)
        {
            try
            {
                string sLine = "";
                byte [] buffer = null;
                bool isEOC = false;
                bool readBinaryBody = false;

                while(sLine != null)
                {
                    //Check if the Binary encoding header is found
                    if (_headers["content-transfer-encoding"] != null &&
                        MimeBodyPart.GetMimeEncoding(_headers["content-transfer-encoding"].Value) == MimeBodyPart.MimeEncoding.Binary
                        && buffer == null)
                    {
                        readBinaryBody = true;
                    }
                    MimeParser.ChunkType chunkType = mp.ReadNextChunk(ref sLine, ref isEOC, ref readBinaryBody, ref buffer);

                    switch(chunkType)
                    {
                        case MimeParser.ChunkType.VersionHeader:
                        case MimeParser.ChunkType.Header:
                            MimeHeader mh = new MimeHeader(sLine);
                            InitializeMultipart(ref mp, mh);
                            _headers.Add(mh);
                            break;
                        case MimeParser.ChunkType.Body:
                            CreateBody(sLine, buffer);
                            break;
                        case MimeParser.ChunkType.StartBoundary:
                            if (_body == null)
                                CreateBody("", buffer);
                            MimeMessage firstMessage = new MimeMessage(ref mp, (MimeMultipartBody)_body);
                            break;
                        case MimeParser.ChunkType.Boundary:
                            MimeMessage nextMessage = new MimeMessage(ref mp, parentMultipartBody);
                            return;
                        case MimeParser.ChunkType.EndBoundary:
                            return;
                        case MimeParser.ChunkType.EOF:
                            break;
                        default:
                            break;
                    }
                }
            }
            catch(Exception err)
            {
                logger.Error(err);
                throw;
            }
        }
 /// <summary>
 /// Append the given part to the body
 /// </summary>
 /// <param name="part"></param>
 public void AppendPart(MimeMessage part)
 {
     if (_isMultiPart)
     {
         if (_body == null)
         {
             _body  = new MimeMultipartBody();
         }
         ((MimeMultipartBody)_body).Add(part);
     }
 }
 /// <summary>
 /// Construct a new Mime Multipart message
 /// </summary>
 /// <returns></returns>
 public static MimeMessage CreateMimeMultipartRelated()
 {
     MimeMessage message = new MimeMessage();
     message._body = new MimeMultipartBody();
     message.Headers.Add(new MimeHeader("Content-Type:" + message._body.ContentType + "; boundary=" + ((MimeMultipartBody)message._body).Boundary));
     message._body.SetText("This is a multi-part message in MIME format.");
     message._isMultiPart = true;
     return message;
 }
 /// <summary>
 /// Add a mime message to the multipart message.
 /// </summary>
 /// <param name="part">The MimeMessage to add.</param>
 /// <returns>The newly added MimeMessage</returns>
 public MimeMessage Add(MimeMessage part)
 {
     return _parts.Add(part);
 }
 /// <summary>
 /// Remove the given MimeMessage from this multipart message.
 /// </summary>
 /// <param name="part">The MimeMessage to remove.</param>
 public void Remove(MimeMessage part)
 {
     _parts.Remove(part);
 }
 /// <summary>
 /// Add a mime message.
 /// </summary>
 /// <param name="part">The part to add.</param>
 /// <returns>The newly added part.</returns>
 public MimeMessage Add(MimeMessage part)
 {
     _parts.Add(part);
     return part;
 }