// // System.Web.Mail.MailMessageWrapper.cs // // Author(s): // Per Arneng // Sanjay Gupta // // (C) 2004, Novell, Inc. (http://www.novell.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Text; namespace System.Web.Mail { // wraps a MailMessage to make an easier // interface to work with collections of // addresses instead of a single string internal class MailMessageWrapper { MailAddressCollection bcc = new MailAddressCollection(); MailAddressCollection cc = new MailAddressCollection(); MailAddress from; MailAddressCollection to = new MailAddressCollection(); MailHeader header = new MailHeader(); MailMessage message; string body; // Constructor public MailMessageWrapper( MailMessage message ) { this.message = message; if( message.From != null ) { from = MailAddress.Parse( message.From ); header.From = from.ToString(); } if( message.To != null ) { to = MailAddressCollection.Parse( message.To ); header.To = to.ToString(); } if( message.Cc != null ) { cc = MailAddressCollection.Parse( message.Cc ); header.Cc = cc.ToString(); } if( message.Bcc != null ) { bcc = MailAddressCollection.Parse( message.Bcc ); header.Bcc = bcc.ToString(); } // set the subject if( message.Subject != null ) { // encode the subject if it needs encoding if( MailUtil.NeedEncoding( message.Subject ) ) { byte[] subjectBytes = message.BodyEncoding.GetBytes( message.Subject ); // encode the subject with Base64 header.Subject = "=?" + message.BodyEncoding.BodyName + "?B?" + Convert.ToBase64String (subjectBytes) + "?="; } else { header.Subject = message.Subject; } } // convert single '.' on a line with ".." to not // confuse the smtp server since the DATA command // is terminated with a '.' on a single line. // this is also according to the smtp specs. if( message.Body != null ) { body = message.Body.Replace( "\n.\n" , "\n..\n" ); body = body.Replace( "\r\n.\r\n" , "\r\n..\r\n" ); } // set the Contet-Base header if( message.UrlContentBase != null ) header.ContentBase = message.UrlContentBase; // set the Contet-Location header if( message.UrlContentLocation != null ) header.ContentLocation = message.UrlContentLocation; // set the content type switch( message.BodyFormat ) { case MailFormat.Html: header.ContentType = String.Concat ( "text/html; charset=\"", message.BodyEncoding.BodyName, "\""); break; case MailFormat.Text: header.ContentType = String.Concat ( "text/plain; charset=\"", message.BodyEncoding.BodyName, "\""); break; default: header.ContentType = String.Concat ( "text/html; charset=\"", message.BodyEncoding.BodyName, "\""); break; } // set the priority as in the same way as .NET sdk does switch( message.Priority ) { case MailPriority.High: header.Importance = "high"; break; case MailPriority.Low: header.Importance = "low"; break; case MailPriority.Normal: header.Importance = "normal"; break; default: header.Importance = "normal"; break; } // .NET sdk allways sets this to normal header.Priority = "normal"; // Set the mime version header.MimeVersion = "1.0"; // Set the transfer encoding if( message.BodyEncoding is ASCIIEncoding ) { header.ContentTransferEncoding = "7bit"; } else { header.ContentTransferEncoding = "8bit"; } // Add Date header, we were missing earlier 27/08/04 // RFC822 requires date to be in format Fri, 27 Aug 2004 20:13:20 +0530 //DateTime.Now gives in format 8/27/2004 8:13:00 PM // Need to explore further dateTime formats available or do we need // to write a function to convert. //header.Data.Add ("Date", DateTime.Now.ToString()); // Add the custom headers foreach( string key in message.Headers.Keys ) header.Data[ key ] = (string)this.message.Headers[ key ]; } // Properties public IList Attachments { get { return message.Attachments; } } public MailAddressCollection Bcc { get { return bcc; } } public string Body { get { return body; } set { body = value; } } public Encoding BodyEncoding { get { return message.BodyEncoding; } set { message.BodyEncoding = value; } } public MailFormat BodyFormat { get { return message.BodyFormat; } set { message.BodyFormat = value; } } public MailAddressCollection Cc { get { return cc; } } public MailAddress From { get { return from; } } public MailHeader Header { get { return header; } } public MailPriority Priority { get { return message.Priority; } set { message.Priority = value; } } public string Subject { get { return message.Subject; } set { message.Subject = value; } } public MailAddressCollection To { get { return to; } } public string UrlContentBase { get { return message.UrlContentBase; } } public string UrlContentLocation { get { return message.UrlContentLocation; } } #if NET_1_1 public MailHeader Fields { get { MailHeader bodyHeaders = new MailHeader(); // Add Fields to MailHeader Object foreach( string key in message.Fields.Keys ) bodyHeaders.Data[ key ] = this.message.Fields[ key ].ToString(); return bodyHeaders; } } #endif } }