MailMessageEx.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Mail;
  4. using System.Net.Mime;
  5. using System.Text.RegularExpressions;
  6. namespace Ant.Service.Utilities
  7. {
  8. /// <summary>
  9. /// This class adds a few internet mail headers not already exposed by the
  10. /// System.Net.MailMessage. It also provides support to encapsulate the
  11. /// nested mail attachments in the Children collection.
  12. /// </summary>
  13. public class MailMessageEx : System.Net.Mail.MailMessage
  14. {
  15. public const string EmailRegexPattern = "(['\"]{1,}.+['\"]{1,}\\s+)?<?[\\w\\.\\-]+@[^\\.][\\w\\.\\-]+\\.[a-z]{2,}>?";
  16. private long _octets;
  17. public long Octets
  18. {
  19. get { return _octets; }
  20. set { _octets = value; }
  21. }
  22. private int _messageNumber;
  23. /// <summary>
  24. /// Gets or sets the message number of the MailMessage on the POP3 server.
  25. /// </summary>
  26. /// <value>The message number.</value>
  27. public int MessageNumber
  28. {
  29. get { return _messageNumber; }
  30. internal set { _messageNumber = value; }
  31. }
  32. private static readonly char[] AddressDelimiters = new char[] { ',', ';' };
  33. private List<MailMessageEx> _children;
  34. /// <summary>
  35. /// Gets the children MailMessage attachments.
  36. /// </summary>
  37. /// <value>The children MailMessage attachments.</value>
  38. public List<MailMessageEx> Children
  39. {
  40. get
  41. {
  42. return _children;
  43. }
  44. }
  45. /// <summary>
  46. /// Gets the delivery date.
  47. /// </summary>
  48. /// <value>The delivery date.</value>
  49. public DateTime DeliveryDate
  50. {
  51. get
  52. {
  53. string date = GetHeader(MailHeaders.Date);
  54. if (string.IsNullOrEmpty(date))
  55. {
  56. return DateTime.MinValue;
  57. }
  58. if ((date.IndexOf("(EST)") > 1) && (date.IndexOf("-") > 1))
  59. {
  60. date = date.Substring(0, date.IndexOf("-"));
  61. }
  62. return Convert.ToDateTime(date);
  63. }
  64. }
  65. /// <summary>
  66. /// Gets the return address.
  67. /// </summary>
  68. /// <value>The return address.</value>
  69. public MailAddress ReturnAddress
  70. {
  71. get
  72. {
  73. string replyTo = GetHeader(MailHeaders.ReplyTo);
  74. if (string.IsNullOrEmpty(replyTo))
  75. {
  76. return null;
  77. }
  78. return CreateMailAddress(replyTo);
  79. }
  80. }
  81. /// <summary>
  82. /// Gets the routing.
  83. /// </summary>
  84. /// <value>The routing.</value>
  85. public string Routing
  86. {
  87. get { return GetHeader(MailHeaders.Received); }
  88. }
  89. /// <summary>
  90. /// Gets the message id.
  91. /// </summary>
  92. /// <value>The message id.</value>
  93. public string MessageId
  94. {
  95. get { return GetHeader(MailHeaders.MessageId); }
  96. }
  97. public string ReplyToMessageId
  98. {
  99. get { return GetHeader(MailHeaders.InReplyTo, true); }
  100. }
  101. /// <summary>
  102. /// Gets the MIME version.
  103. /// </summary>
  104. /// <value>The MIME version.</value>
  105. public string MimeVersion
  106. {
  107. get { return GetHeader(MimeHeaders.MimeVersion); }
  108. }
  109. /// <summary>
  110. /// Gets the content id.
  111. /// </summary>
  112. /// <value>The content id.</value>
  113. public string ContentId
  114. {
  115. get { return GetHeader(MimeHeaders.ContentId); }
  116. }
  117. /// <summary>
  118. /// Gets the content description.
  119. /// </summary>
  120. /// <value>The content description.</value>
  121. public string ContentDescription
  122. {
  123. get { return GetHeader(MimeHeaders.ContentDescription); }
  124. }
  125. /// <summary>
  126. /// Gets the content disposition.
  127. /// </summary>
  128. /// <value>The content disposition.</value>
  129. public ContentDisposition ContentDisposition
  130. {
  131. get
  132. {
  133. string contentDisposition = GetHeader(MimeHeaders.ContentDisposition);
  134. if (string.IsNullOrEmpty(contentDisposition))
  135. {
  136. return null;
  137. }
  138. return new ContentDisposition(contentDisposition);
  139. }
  140. }
  141. /// <summary>
  142. /// Gets the type of the content.
  143. /// </summary>
  144. /// <value>The type of the content.</value>
  145. public ContentType ContentType
  146. {
  147. get
  148. {
  149. string contentType = GetHeader(MimeHeaders.ContentType);
  150. if (string.IsNullOrEmpty(contentType))
  151. {
  152. return null;
  153. }
  154. return MimeReader.GetContentType(contentType);
  155. }
  156. }
  157. /// <summary>
  158. /// Initializes a new instance of the <see cref="MailMessageEx"/> class.
  159. /// </summary>
  160. public MailMessageEx()
  161. : base()
  162. {
  163. _children = new List<MailMessageEx>();
  164. }
  165. /// <summary>
  166. /// Gets the header.
  167. /// </summary>
  168. /// <param name="header">The header.</param>
  169. /// <returns></returns>
  170. private string GetHeader(string header)
  171. {
  172. return GetHeader(header, false);
  173. }
  174. private string GetHeader(string header, bool stripBrackets)
  175. {
  176. if (stripBrackets)
  177. {
  178. return MimeEntity.TrimBrackets(Headers[header]);
  179. }
  180. return Headers[header];
  181. }
  182. /// <summary>
  183. /// Creates the mail message from entity.
  184. /// </summary>
  185. /// <param name="entity">The entity.</param>
  186. /// <returns></returns>
  187. public static MailMessageEx CreateMailMessageFromEntity(MimeEntity entity)
  188. {
  189. MailMessageEx message = new MailMessageEx();
  190. string value;
  191. foreach (string key in entity.Headers.AllKeys)
  192. {
  193. value = entity.Headers[key];
  194. if (value.Equals(string.Empty))
  195. {
  196. value = " ";
  197. }
  198. message.Headers.Add(key.ToLowerInvariant(), value);
  199. switch (key.ToLowerInvariant())
  200. {
  201. case MailHeaders.Bcc:
  202. MailMessageEx.PopulateAddressList(value, message.Bcc);
  203. break;
  204. case MailHeaders.Cc:
  205. MailMessageEx.PopulateAddressList(value, message.CC);
  206. break;
  207. case MailHeaders.From:
  208. message.From = MailMessageEx.CreateMailAddress(value);
  209. break;
  210. case MailHeaders.ReplyTo:
  211. message.ReplyTo = MailMessageEx.CreateMailAddress(value);
  212. break;
  213. case MailHeaders.Subject:
  214. message.Subject = value;
  215. break;
  216. case MailHeaders.To:
  217. MailMessageEx.PopulateAddressList(value, message.To);
  218. break;
  219. }
  220. }
  221. return message;
  222. }
  223. /// <summary>
  224. /// Creates the mail address.
  225. /// </summary>
  226. /// <param name="address">The address.</param>
  227. /// <returns></returns>
  228. public static MailAddress CreateMailAddress(string address)
  229. {
  230. try
  231. {
  232. return new MailAddress(address.Trim('\t'));
  233. }
  234. catch //(FormatException e)
  235. {
  236. //throw new Pop3Exception("Unable to create mail address from provided string: " + address, e);Mail Delivery System
  237. return new MailAddress(address + "@mail.error");
  238. }
  239. }
  240. /// <summary>
  241. /// Populates the address list.
  242. /// </summary>
  243. /// <param name="addressList">The address list.</param>
  244. /// <param name="recipients">The recipients.</param>
  245. public static void PopulateAddressList(string addressList, MailAddressCollection recipients)
  246. {
  247. foreach (MailAddress address in GetMailAddresses(addressList))
  248. {
  249. recipients.Add(address);
  250. }
  251. }
  252. /// <summary>
  253. /// Gets the mail addresses.
  254. /// </summary>
  255. /// <param name="addressList">The address list.</param>
  256. /// <returns></returns>
  257. private static IEnumerable<MailAddress> GetMailAddresses(string addressList)
  258. {
  259. Regex email = new Regex(EmailRegexPattern);
  260. foreach (Match match in email.Matches(addressList))
  261. {
  262. yield return CreateMailAddress(match.Value);
  263. }
  264. /*
  265. string[] addresses = addressList.Split(AddressDelimiters);
  266. foreach (string address in addresses)
  267. {
  268. yield return CreateMailAddress(address);
  269. }*/
  270. }
  271. }
  272. }