2010-05-04 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / System / System.Net.Mail / MailMessage.cs
index c45ac4e9283727196ba8158310ff8eb5b318a93c..98d3244e330dabdf2323270e63ea09fc415b475c 100644 (file)
@@ -36,7 +36,6 @@ using System.Net.Mime;
 using System.Text;
 
 namespace System.Net.Mail {
-       [MonoTODO]
        public class MailMessage : IDisposable
        {
                #region Fields
@@ -44,58 +43,71 @@ namespace System.Net.Mail {
                AlternateViewCollection alternateViews;
                AttachmentCollection attachments;
                MailAddressCollection bcc;
+               MailAddressCollection replyTo;          
                string body;
                MailPriority priority;
-               MailAddress replyTo, sender;
+               MailAddress sender;
                DeliveryNotificationOptions deliveryNotificationOptions;
                MailAddressCollection cc;
                MailAddress from;
                NameValueCollection headers;
                MailAddressCollection to;
                string subject;
-               Encoding subjectEncoding;
-               ContentType bodyContentType;
+               Encoding subjectEncoding, bodyEncoding, headersEncoding = Encoding.UTF8;
+               bool isHtml;
 
                #endregion // Fields
 
                #region Constructors
 
-               public MailMessage ()
-               {
-               }
-
-               [MonoTODO ("FormatException")]
-               public MailMessage (MailAddress from, MailAddress to)
-               {
-                       if (from == null || to == null)
-                               throw new ArgumentNullException ();
-                       
-                       From = from;
-
+               public MailMessage () {
                        this.to = new MailAddressCollection ();
-                       this.to.Add (to);
 
                        alternateViews = new AlternateViewCollection ();
                        attachments = new AttachmentCollection ();
                        bcc = new MailAddressCollection ();
                        cc = new MailAddressCollection ();
+                       replyTo = new MailAddressCollection ();
                        headers = new NameValueCollection ();
 
                        headers.Add ("MIME-Version", "1.0");
                }
 
-               public MailMessage (string from, string to)
-                       : this (new MailAddress (from), new MailAddress (to))
+               // FIXME: should it throw a FormatException if the addresses are wrong? 
+               // (How is it possible to instantiate such a malformed MailAddress?)
+               public MailMessage (MailAddress from, MailAddress to) : this ()
                {
                        if (from == null || to == null)
                                throw new ArgumentNullException ();
+
+                       From = from;
+
+                       this.to.Add (to);
                }
 
-               public MailMessage (string from, string to, string subject, string body)
-                       : this (new MailAddress (from), new MailAddress (to))
+               public MailMessage (string from, string to) : this ()
                {
-                       if (from == null || to == null)
-                               throw new ArgumentNullException ();
+                       if (from == null || from == String.Empty)
+                               throw new ArgumentNullException ("from");
+                       if (to == null || to == String.Empty)
+                               throw new ArgumentNullException ("to");
+                       
+                       this.from = new MailAddress (from);
+                       foreach (string recipient in to.Split (new char [] {','}))
+                               this.to.Add (new MailAddress (recipient.Trim ()));
+               }
+
+               public MailMessage (string from, string to, string subject, string body) : this ()
+               {
+                       if (from == null || from == String.Empty)
+                               throw new ArgumentNullException ("from");
+                       if (to == null || to == String.Empty)
+                               throw new ArgumentNullException ("to");
+                       
+                       this.from = new MailAddress (from);
+                       foreach (string recipient in to.Split (new char [] {','}))
+                               this.to.Add (new MailAddress (recipient.Trim ()));
+
                        Body = body;
                        Subject = subject;
                }
@@ -118,20 +130,29 @@ namespace System.Net.Mail {
 
                public string Body {
                        get { return body; }
-                       set { body = value; }
+                       set {
+                               // autodetect suitable body encoding (ASCII or UTF-8), if it is not initialized yet.
+                               if (value != null && bodyEncoding == null)
+                                       bodyEncoding = GuessEncoding (value) ?? Encoding.ASCII;
+                               body = value;
+                       }
                }
 
                internal ContentType BodyContentType {
                        get {
-                               if (bodyContentType == null)
-                                       bodyContentType = new ContentType ("text/plain; charset=us-ascii");
-                               return bodyContentType;
+                               ContentType ct = new ContentType (isHtml ? "text/html" : "text/plain");
+                               ct.CharSet = (BodyEncoding ?? Encoding.ASCII).HeaderName;
+                               return ct;
                        }
                }
 
+               internal TransferEncoding ContentTransferEncoding {
+                       get { return ContentType.GuessTransferEncoding (BodyEncoding); }
+               }
+
                public Encoding BodyEncoding {
-                       get { return Encoding.GetEncoding (BodyContentType.CharSet); }
-                       set { BodyContentType.CharSet = value.WebName; }
+                       get { return bodyEncoding; }
+                       set { bodyEncoding = value; }
                }
 
                public MailAddressCollection CC {
@@ -153,13 +174,8 @@ namespace System.Net.Mail {
                }
 
                public bool IsBodyHtml {
-                       get { return String.Compare (BodyContentType.MediaType, "text/html", true, CultureInfo.InvariantCulture) == 0; }
-                       set {
-                               if (value)
-                                       BodyContentType.MediaType = "text/html";
-                               else
-                                       BodyContentType.MediaType = "text/plain";
-                       }
+                       get { return isHtml; }
+                       set { isHtml = value; }
                }
 
                public MailPriority Priority {
@@ -167,9 +183,38 @@ namespace System.Net.Mail {
                        set { priority = value; }
                }
 
-               public MailAddress ReplyTo {
+#if NET_4_0
+               public
+#else
+               internal
+#endif
+               Encoding HeadersEncoding {
+                       get { return headersEncoding; }
+                       set { headersEncoding = value; } 
+               }
+
+#if NET_4_0
+               public
+#else
+               internal
+#endif
+               MailAddressCollection ReplyToList {
                        get { return replyTo; }
-                       set { replyTo = value; }
+               }
+
+#if NET_4_0
+               [Obsolete ("Use ReplyToList instead")]
+#endif
+               public MailAddress ReplyTo {
+                       get {
+                               if (replyTo.Count == 0)
+                                       return null;
+                               return replyTo [0];
+                       }
+                       set {
+                               replyTo.Clear ();
+                               replyTo.Add (value);
+                       }
                }
 
                public MailAddress Sender {
@@ -179,7 +224,11 @@ namespace System.Net.Mail {
 
                public string Subject {
                        get { return subject; }
-                       set { subject = value; }
+                       set {
+                               if (value != null && subjectEncoding == null)
+                                       subjectEncoding = GuessEncoding (value);
+                               subject = value;
+                       }
                }
 
                public Encoding SubjectEncoding {
@@ -205,6 +254,11 @@ namespace System.Net.Mail {
                {
                }
 
+               private Encoding GuessEncoding (string s)
+               {
+                       return ContentType.GuessEncoding (s);
+               }
+
                #endregion // Methods
        }
 }