/HigLaboNet/HigLabo.Mime/Mail/MailAddress.cs

# · C# · 227 lines · 175 code · 4 blank · 48 comment · 31 complexity · 36b2016f88f2fc86072042ebe40b2bd6 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. #if !NETFX_CORE
  5. using System.Security.Cryptography.X509Certificates;
  6. #endif
  7. using System.Text;
  8. namespace HigLabo.Mime
  9. {
  10. public class MailAddress
  11. {
  12. private String _RawValue = "";
  13. private String _Value = "";
  14. private String _DisplayName = "";
  15. private String _UserName = "";
  16. private String _DomainName = "";
  17. public Boolean AsciiCharOnly { get; set; }
  18. /// <summary>
  19. ///
  20. /// </summary>
  21. public String RawValue
  22. {
  23. get { return this._RawValue; }
  24. private set { this._RawValue = value; }
  25. }
  26. /// メールアドレスの値を取得または設定します。
  27. /// <summary>
  28. /// Get or set mailaddress value.
  29. /// メールアドレスの値を取得または設定します。
  30. /// </summary>
  31. public String Value
  32. {
  33. get { return this._Value; }
  34. private set { this._Value = value; }
  35. }
  36. /// 表示名を取得または設定します。
  37. /// <summary>
  38. /// 表示名を取得または設定します。
  39. /// </summary>
  40. public String DisplayName
  41. {
  42. get { return this._DisplayName; }
  43. private set { this._DisplayName = value; }
  44. }
  45. /// ユーザー名を取得または設定します。
  46. /// <summary>
  47. /// ユーザー名を取得または設定します。
  48. /// </summary>
  49. public String UserName
  50. {
  51. get { return this._UserName; }
  52. private set { this._UserName = value; }
  53. }
  54. /// ドメイン名を取得または設定します。
  55. /// <summary>
  56. /// ドメイン名を取得または設定します。
  57. /// </summary>
  58. public String DomainName
  59. {
  60. get { return this._DomainName; }
  61. private set { this._DomainName = value; }
  62. }
  63. /// <summary>
  64. ///
  65. /// </summary>
  66. public Boolean ValidFormat { get; set; }
  67. #if NETFX_CORE
  68. public CryptographicKeyInfo CryptographicKeyInfo { get; set; }
  69. #else
  70. /// <summary>
  71. ///
  72. /// </summary>
  73. public X509Certificate2 SigningCertificate { get; set; }
  74. /// <summary>
  75. ///
  76. /// </summary>
  77. public X509Certificate2 EncryptionCertificate { get; set; }
  78. #endif
  79. public MailAddress(String value)
  80. {
  81. SetProperty(this, value);
  82. }
  83. public static MailAddress TryCreate(String value)
  84. {
  85. if (String.IsNullOrEmpty(value) == true) { return null; }
  86. return new MailAddress(value);
  87. }
  88. private static void SetProperty(MailAddress mailAddress, String value)
  89. {
  90. MailAddress m = mailAddress;
  91. var trimValue = value.Trim();
  92. Int32 displayNameEndIndex = 0;
  93. Int32 valueIndex = -1;
  94. Int32 valueEndIndex = -1;
  95. Int32 atmarkIndex = -1;
  96. m.AsciiCharOnly = true;
  97. for (int i = 0; i < trimValue.Length; i++)
  98. {
  99. if ((Byte)trimValue[i] >= 128)
  100. {
  101. m.AsciiCharOnly = false;
  102. }
  103. if (trimValue[i] == ' ')
  104. {
  105. displayNameEndIndex = i;
  106. }
  107. if (trimValue[i] == '<')
  108. {
  109. valueIndex = i + 1;
  110. }
  111. if (trimValue[i] == '@')
  112. {
  113. atmarkIndex = i;
  114. }
  115. if (atmarkIndex > -1 &&
  116. trimValue[i] == '>')
  117. {
  118. valueEndIndex = i;
  119. break;
  120. }
  121. }
  122. if (atmarkIndex == -1)
  123. {
  124. m.ValidFormat = false;
  125. m.RawValue = value;
  126. return;
  127. }
  128. m.ValidFormat = true;
  129. if (valueEndIndex == -1) { valueEndIndex = trimValue.Length - 1; }
  130. if (valueIndex > -1)
  131. {
  132. //"Bill Gates" <bill@microsoft.com>
  133. //Bill <bill@microsoft.com>
  134. //<bill@microsoft.com>
  135. m.DisplayName = trimValue.Substring(0, displayNameEndIndex).Trim();
  136. if (m.DisplayName.Length > 1 &&
  137. m.DisplayName[0] == '"' &&
  138. m.DisplayName[m.DisplayName.Length - 1] == '"')
  139. {
  140. m.DisplayName = m.DisplayName.Substring(1, m.DisplayName.Length - 2);
  141. }
  142. m.Value = trimValue.Substring(valueIndex, valueEndIndex - valueIndex);
  143. m.UserName = trimValue.Substring(valueIndex, atmarkIndex - valueIndex);
  144. m.DomainName = trimValue.Substring(atmarkIndex + 1, valueEndIndex - atmarkIndex - 1);
  145. }
  146. else
  147. {
  148. //bill@microsoft.com
  149. valueIndex = 0;
  150. m.Value = value;
  151. m.UserName = trimValue.Substring(valueIndex, atmarkIndex - valueIndex);
  152. m.DomainName = trimValue.Substring(atmarkIndex + 1, valueEndIndex - atmarkIndex);
  153. }
  154. m.RawValue = value;
  155. }
  156. /// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
  157. /// <summary>
  158. /// Get mailaddress list from mail address list text.
  159. /// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
  160. /// </summary>
  161. /// <param name="mailAddressListText"></param>
  162. /// <returns></returns>
  163. public static List<MailAddress> CreateMailAddressList(String mailAddressListText)
  164. {
  165. return CreateMailAddressList(mailAddressListText, ',', ';');
  166. }
  167. /// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
  168. /// <summary>
  169. /// Get mailaddress list from mail address list text.
  170. /// メールアドレス一覧の文字列からMailAddressの一覧を取得します。
  171. /// </summary>
  172. /// <param name="mailAddressListText"></param>
  173. /// <param name="separators"></param>
  174. /// <returns></returns>
  175. public static List<MailAddress> CreateMailAddressList(String mailAddressListText, params Char[] separators)
  176. {
  177. List<MailAddress> l = new List<MailAddress>();
  178. MailAddress m = null;
  179. Boolean isSeparator = false;
  180. Int32 index = 0;
  181. for (int i = 0; i < mailAddressListText.Length; i++)
  182. {
  183. isSeparator = false;
  184. if (i == mailAddressListText.Length - 1)
  185. {
  186. String s = mailAddressListText.Substring(index, mailAddressListText.Length - index);
  187. m = MailAddress.TryCreate(s.Trim());
  188. if (m != null)
  189. {
  190. l.Add(m);
  191. }
  192. break;
  193. }
  194. else
  195. {
  196. for (int cIndex = 0; cIndex < separators.Length; cIndex++)
  197. {
  198. if (mailAddressListText[i] == separators[cIndex])
  199. {
  200. isSeparator = true;
  201. break;
  202. }
  203. }
  204. }
  205. if (isSeparator == true)
  206. {
  207. String s = mailAddressListText.Substring(index, i - index);
  208. m = MailAddress.TryCreate(s.Trim());
  209. if (m != null)
  210. {
  211. l.Add(m);
  212. }
  213. index = i + 1;
  214. }
  215. }
  216. return l;
  217. }
  218. public override string ToString()
  219. {
  220. return this.RawValue;
  221. }
  222. }
  223. }