private void Parse(byte[] buffer)
        {
            int headerIndex = Util.IndexOfBuffer(buffer, Util.CrlfBuffer);

            if (headerIndex > -1)
            {
                byte[] headerBuffer = new byte[headerIndex];
                System.Array.Copy(buffer, 0, headerBuffer, 0, headerBuffer.Length);

                ParseHeader(headerBuffer);
            }

            /////////////// This part of code is same in Message and BodyPart classes

            if (buffer.Length > headerIndex + 4)
            {
                byte[] bodyBuffer = new byte[buffer.Length - headerIndex - 4];
                System.Array.Copy(buffer, headerIndex + 4, bodyBuffer, 0, bodyBuffer.Length);

                ContentType             contentType             = this.ContentType;
                ContentDisposition      contentDisposition      = this.ContentDisposition;
                ContentTransferEncoding contentTransferEncoding = this.ContentTransferEncoding;

                if (contentType == null)
                {
                    body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                }
                else if ((contentType.Type != null && contentType.Type.ToLower() == "text") ||
                         (contentType.Type != null && contentType.Type.ToLower() == "text" && contentDisposition != null && contentDisposition.Type == ContentDispositionType.Inline))
                {
                    Parameter charsetParameter = contentType.Parameters["charset"];

                    if (charsetParameter != null && charsetParameter.Value != null)
                    {
                        Encoding encoding = Util.GetEncoding(charsetParameter.Value);
                        body = encoding.GetString(bodyBuffer, 0, bodyBuffer.Length);

                        if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
                        {
                            body = Util.DecodeQuotedPrintable(body, encoding);
                        }
                        else if (contentTransferEncoding == ContentTransferEncoding.Base64)
                        {
                            body = Util.DecodeBase64(body, encoding);
                        }
                        else
                        {
                            body = encoding.GetString(bodyBuffer, 0, bodyBuffer.Length);
                        }
                    }
                    else
                    {
                        body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);

                        if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
                        {
                            body = Util.DecodeQuotedPrintable(body, System.Text.Encoding.Default);
                        }
                        else if (contentTransferEncoding == ContentTransferEncoding.Base64)
                        {
                            body = Util.DecodeBase64(body, System.Text.Encoding.Default);
                        }
                    }
                }
                else if (contentType.Type != null && contentType.Type.ToLower() == "multipart")
                {
                    Parameter boundaryParameter = contentType.Parameters["boundary"];

                    if (boundaryParameter != null && boundaryParameter.Value != null)
                    {
                        string boundary = boundaryParameter.Value;

                        IList <byte[]> bodyPartsBufferList = Util.GetBodyPartsBuffers(bodyBuffer, boundary);

                        for (int i = 0; i < bodyPartsBufferList.Count; i++)
                        {
                            byte[] bodyPartBuffer = bodyPartsBufferList[i];

                            BodyPart bodyPart = new BodyPart(bodyPartBuffer);
                            bodyParts.Add(bodyPart);
                        }
                    }
                }
                else if (contentType.Type != null && contentType.Type.ToLower() == "message")
                {
                    if (contentType.SubType != null && contentType.SubType.ToLower() == "rfc822")
                    {
                        embeddedMessage = new Message(bodyBuffer);
                    }
                    else if (contentType.SubType != null && contentType.SubType.ToLower() == "delivery-status")
                    {
                        byte[] encodedBodyBuffer = new byte[0];

                        if (contentTransferEncoding == ContentTransferEncoding.Base64)
                        {
                            String base64String = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);

                            if (base64String != null && base64String.Length > 0)
                            {
                                encodedBodyBuffer = Convert.FromBase64String(base64String);
                            }
                        }

                        if (encodedBodyBuffer.Length > 0)
                        {
                            try
                            {
                                embeddedMessage         = new Message(encodedBodyBuffer);
                                embeddedMessage.Subject = contentType.Parameters["name"] != null ? contentType.Parameters["name"].Value : "ATT";
                            }
                            catch (MessageFormatException)
                            {
                                body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                            }
                        }
                    }
                    else if (contentType.SubType != null && contentType.SubType == "partial")
                    {
                        body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                    }
                }
                else //contentType = image, application, video, audio, ...
                {
                    if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
                    {
                        body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                        body = body.Replace("=09", "\t");
                        body = body.Replace("=0D", "\r");
                        body = body.Replace("=0A", "\n");
                        body = body.Replace("=20", " ");
                        body = body.Replace("=\r\n", String.Empty);
                    }
                    else if (contentTransferEncoding == ContentTransferEncoding.Base64)
                    {
                        bodyBuffer = Util.RemoveCRLF(bodyBuffer);

                        body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                    }
                    else
                    {
                        body = System.Text.Encoding.Default.GetString(bodyBuffer, 0, bodyBuffer.Length);
                    }
                }
            }

            ///////////////////////////////////////////////////////////////////////////////////////
        }
        private Stream GetStreamImplementation()
        {
            MemoryStream memoryStream = new MemoryStream();

            string headerString = "";

            //Content type
            ContentType contentType = this.ContentType;
            string      boundary    = null;

            if (contentType != null && contentType.Type != null && contentType.Type.ToLower() == "multipart")
            {
                contentType.Parameters.Remove("boundary");

                boundary = "----=_NextPart_" + Util.NewGuid();
                contentType.Parameters.Add(new Parameter("boundary", boundary));

                this.ContentType = contentType;
            }
            else if (contentType == null && bodyParts.Count > 0)
            {
                contentType = new ContentType("multipart", "mixed");

                boundary = "----=_NextPart_" + Util.NewGuid();
                contentType.Parameters.Add(new Parameter("boundary", boundary));

                this.ContentType = contentType;
            }
            else if (contentType == null)
            {
                contentType      = new ContentType("text", "plain");
                this.ContentType = contentType;
            }

            //Header
            for (int i = 0; i < headers.Count; i++)
            {
                Header header = headers[i];

                if (header != null && header.Name != null && header.Value != null)
                {
                    if (Util.HasToEncodeHeader(header.Name, header.Value))
                    {
                        string doNotEncodePrefix = "";
                        string doNotEncodeSuffix = "";

                        string headerValueToEncode = header.Value;

                        //do not encode content-type and content-disposition headers
                        if (header.Name.ToLower() == "content-type" || header.Name.ToLower() == "content-disposition")
                        {
                            int semiColonIndex = headerValueToEncode.IndexOf(";");

                            if (semiColonIndex > -1)
                            {
                                doNotEncodePrefix   = headerValueToEncode.Substring(0, semiColonIndex + 1);
                                headerValueToEncode = headerValueToEncode.Substring(semiColonIndex + 1, header.Value.Length - semiColonIndex - 1);
                            }

                            int fileNameIndex = headerValueToEncode.IndexOf("filename=");

                            if (fileNameIndex > -1)
                            {
                                int nextSemiColonIndex = headerValueToEncode.IndexOf(";", fileNameIndex);

                                if (nextSemiColonIndex == -1)
                                {
                                    nextSemiColonIndex = headerValueToEncode.Length;
                                }

                                doNotEncodePrefix  += headerValueToEncode.Substring(0, 10);
                                headerValueToEncode = headerValueToEncode.Substring(10, nextSemiColonIndex - 10);

                                headerValueToEncode = headerValueToEncode.Trim(new char[] { '"' });
                            }

                            int nameIndex = headerValueToEncode.IndexOf("name=");

                            if (nameIndex > -1)
                            {
                                int nextSemiColonIndex = headerValueToEncode.IndexOf(";", nameIndex);

                                if (nextSemiColonIndex == -1)
                                {
                                    nextSemiColonIndex = headerValueToEncode.Length;
                                }

                                doNotEncodePrefix  += headerValueToEncode.Substring(0, 6);
                                headerValueToEncode = headerValueToEncode.Substring(6, nextSemiColonIndex - 6);

                                headerValueToEncode = headerValueToEncode.Trim(new char[] { '"' });
                            }
                        }

                        string encodedHeader = Util.EncodeHeader(headerValueToEncode, this.headerCharSet, headerEncoding);

                        encodedHeader = doNotEncodePrefix + encodedHeader + doNotEncodeSuffix;

                        string headerRowString = header.Name + ": " + encodedHeader;

                        headerRowString = Util.SplitHeaderLines(headerRowString, 76);

                        headerString += headerRowString + "\r\n";
                    }
                    else
                    {
                        string headerRowString = header.Name + ": " + header.Value;

                        headerRowString = Util.SplitHeaderLines(headerRowString, 76);

                        headerString += headerRowString + "\r\n";
                    }
                }
            }

            headerString += "\r\n";

            byte[] headerBuffer = System.Text.Encoding.Default.GetBytes(headerString);
            memoryStream.Write(headerBuffer, 0, headerBuffer.Length);

            if (bodyParts.Count > 0)
            {
                string delimiter     = "--" + boundary;
                string lastDelimiter = "--" + boundary + "--";

                for (int i = 0; i < bodyParts.Count; i++)
                {
                    string delimiterString = "\r\n" + delimiter + "\r\n";
                    byte[] delimiterBuffer = System.Text.Encoding.Default.GetBytes(delimiterString);
                    memoryStream.Write(delimiterBuffer, 0, delimiterBuffer.Length);

                    BodyPart bodyPart       = bodyParts[i];
                    byte[]   bodyPartBuffer = bodyPart.GetBytes();
                    memoryStream.Write(bodyPartBuffer, 0, bodyPartBuffer.Length);
                }

                string lastDelimiterString = "\r\n" + lastDelimiter + "\r\n";
                byte[] lastDelimiterBuffer = System.Text.Encoding.Default.GetBytes(lastDelimiterString);
                memoryStream.Write(lastDelimiterBuffer, 0, lastDelimiterBuffer.Length);
            }
            else if (contentType != null && contentType.Type != null && contentType.Type.ToLower() == "message" && contentType.SubType != null && contentType.SubType.ToLower() == "rfc822" && embeddedMessage != null)
            {
                byte[] embeddedMessageBuffer = embeddedMessage.GetBytes();
                memoryStream.Write(embeddedMessageBuffer, 0, embeddedMessageBuffer.Length);
            }
            else if (contentType != null && contentType.Type != null && contentType.Type.ToLower() == "text" && body != null)
            {
                Encoding encoding = System.Text.Encoding.Default;
                ContentTransferEncoding contentTransferEncoding = ContentTransferEncoding.SevenBit;

                if (contentType != null)
                {
                    Parameter charsetParameter = contentType.Parameters["charset"];

                    if (charsetParameter != null && charsetParameter.Value != null)
                    {
                        encoding = Util.GetEncoding(charsetParameter.Value);
                    }
                }

                Header contentTransferEncodingHeader = headers[StandardHeader.ContentTransferEncoding];

                if (contentTransferEncodingHeader != null && contentTransferEncodingHeader.Value != null)
                {
                    contentTransferEncoding = EnumUtil.ParseContentTransferEncoding(contentTransferEncodingHeader.Value);
                }

                if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
                {
                    string encodedBody = Util.EncodeBodyQuotedPrintable(body, encoding);

                    encodedBody = Util.SplitQuotedPrintableBody(encodedBody);

                    byte[] encodedBodyBuffer = System.Text.Encoding.Default.GetBytes(encodedBody);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
                else if (contentTransferEncoding == ContentTransferEncoding.Base64)
                {
                    byte[] bodyBuffer = encoding.GetBytes(body);

                    string encodedBody = Convert.ToBase64String(bodyBuffer, 0, bodyBuffer.Length);

                    if (encodedBody.IndexOf("\r\n") == -1)
                    {
                        encodedBody = Util.SplitBase64Body(encodedBody);
                    }

                    byte[] encodedBodyBuffer = System.Text.Encoding.Default.GetBytes(encodedBody);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
                else
                {
                    byte[] encodedBodyBuffer = encoding.GetBytes(body);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
            }
            else if (body != null)
            {
                ContentTransferEncoding contentTransferEncoding = ContentTransferEncoding.SevenBit;

                Header contentTransferEncodingHeader = headers[StandardHeader.ContentTransferEncoding];

                if (contentTransferEncodingHeader != null && contentTransferEncodingHeader.Value != null)
                {
                    contentTransferEncoding = EnumUtil.ParseContentTransferEncoding(contentTransferEncodingHeader.Value);
                }

                if (contentTransferEncoding == ContentTransferEncoding.QuotedPrintable)
                {
                    string encodedBody = Util.SplitQuotedPrintableBody(body);

                    byte[] encodedBodyBuffer = System.Text.Encoding.Default.GetBytes(encodedBody);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
                else if (contentTransferEncoding == ContentTransferEncoding.Base64)
                {
                    string encodedBody = body;

                    if (encodedBody.IndexOf("\r\n") == -1)
                    {
                        encodedBody = Util.SplitBase64Body(encodedBody);
                    }

                    byte[] encodedBodyBuffer = System.Text.Encoding.Default.GetBytes(encodedBody);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
                else
                {
                    byte[] encodedBodyBuffer = System.Text.Encoding.Default.GetBytes(body);
                    memoryStream.Write(encodedBodyBuffer, 0, encodedBodyBuffer.Length);
                }
            }

            return(memoryStream);
        }