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