public static MimeMessage CreateFromMailMessage (MailMessage message)
{
if (message == null)
throw new ArgumentNullException (nameof (message));
var headers = new List<Header> ();
foreach (var field in message.Headers.AllKeys) {
foreach (var value in message.Headers.GetValues (field))
headers.Add (new Header (field, value));
}
var msg = new MimeMessage (ParserOptions.Default, headers);
MimeEntity body = null;
// Note: If the user has already sent their MailMessage via System.Net.Mail.SmtpClient,
// then the following MailMessage properties will have been merged into the Headers, so
// check to make sure our MimeMessage properties are empty before adding them.
if (msg.Sender == null && message.Sender != null)
msg.Sender = (MailboxAddress) message.Sender;
if (msg.From.Count == 0 && message.From != null)
msg.From.Add ((MailboxAddress) message.From);
#if NET_3_5
if (msg.ReplyTo.Count == 0 && message.ReplyTo != null)
msg.ReplyTo.Add ((MailboxAddress) message.ReplyTo);
#else
if (msg.ReplyTo.Count == 0 && message.ReplyToList.Count > 0)
msg.ReplyTo.AddRange ((InternetAddressList) message.ReplyToList);
#endif
if (msg.To.Count == 0 && message.To.Count > 0)
msg.To.AddRange ((InternetAddressList) message.To);
if (msg.Cc.Count == 0 && message.CC.Count > 0)
msg.Cc.AddRange ((InternetAddressList) message.CC);
if (msg.Bcc.Count == 0 && message.Bcc.Count > 0)
msg.Bcc.AddRange ((InternetAddressList) message.Bcc);
if (string.IsNullOrEmpty (msg.Subject))
msg.Subject = message.Subject ?? string.Empty;
switch (message.Priority) {
case MailPriority.Normal:
msg.Headers.RemoveAll (HeaderId.XMSMailPriority);
msg.Headers.RemoveAll (HeaderId.Importance);
msg.Headers.RemoveAll (HeaderId.XPriority);
msg.Headers.RemoveAll (HeaderId.Priority);
break;
case MailPriority.High:
msg.Headers.Replace (HeaderId.Priority, "urgent");
msg.Headers.Replace (HeaderId.Importance, "high");
msg.Headers.Replace (HeaderId.XPriority, "2 (High)");
break;
case MailPriority.Low:
msg.Headers.Replace (HeaderId.Priority, "non-urgent");
msg.Headers.Replace (HeaderId.Importance, "low");
msg.Headers.Replace (HeaderId.XPriority, "4 (Low)");
break;
}
if (!string.IsNullOrEmpty (message.Body)) {
var text = new TextPart (message.IsBodyHtml ? "html" : "plain");
text.SetText (message.BodyEncoding ?? Encoding.UTF8, message.Body);
body = text;
}
if (message.AlternateViews.Count > 0) {
var alternative = new MultipartAlternative ();
if (body != null)
alternative.Add (body);
foreach (var view in message.AlternateViews) {
var part = GetMimePart (view);
if (view.BaseUri != null)
part.ContentLocation = view.BaseUri;
if (view.LinkedResources.Count > 0) {
var type = part.ContentType.MediaType + "/" + part.ContentType.MediaSubtype;
var related = new MultipartRelated ();
related.ContentType.Parameters.Add ("type", type);
if (view.BaseUri != null)
related.ContentLocation = view.BaseUri;
related.Add (part);
foreach (var resource in view.LinkedResources) {
part = GetMimePart (resource);
if (resource.ContentLink != null)
part.ContentLocation = resource.ContentLink;
related.Add (part);
}
alternative.Add (related);
} else {
alternative.Add (part);
}
}
body = alternative;
}
if (body == null)
body = new TextPart (message.IsBodyHtml ? "html" : "plain");
if (message.Attachments.Count > 0) {
var mixed = new Multipart ("mixed");
if (body != null)
mixed.Add (body);
foreach (var attachment in message.Attachments)
mixed.Add (GetMimePart (attachment));
body = mixed;
}
msg.Body = body;
return msg;
}