using System.Text;
namespace System.Net.Mail {
- [MonoTODO]
public class MailMessage : IDisposable
{
#region Fields
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;
}
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 {
}
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 {
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 {
public string Subject {
get { return subject; }
- set { subject = value; }
+ set {
+ if (value != null && subjectEncoding == null)
+ subjectEncoding = GuessEncoding (value);
+ subject = value;
+ }
}
public Encoding SubjectEncoding {
{
}
+ private Encoding GuessEncoding (string s)
+ {
+ return ContentType.GuessEncoding (s);
+ }
+
#endregion // Methods
}
}