You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.9 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. using Apewer;
  2. using Apewer.Internals;
  3. using Apewer.Source;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Text;
  8. namespace Apewer.Network
  9. {
  10. /// <summary>邮件。</summary>
  11. public sealed class MailMessage : IToJson
  12. {
  13. private MailAddress _sender = null;
  14. private List<MailAddress> _receiver = new List<MailAddress>();
  15. private List<MailAddress> _carboncopy = new List<MailAddress>();
  16. private List<MailAddress> _blindcarboncopy = new List<MailAddress>();
  17. private Dictionary<string, byte[]> _attachment = new Dictionary<string, byte[]>();
  18. private string _title = Constant.EmptyString;
  19. private string _content = Constant.EmptyString;
  20. private Encoding _encoding = Encoding.UTF8;
  21. private bool _html = false;
  22. private MailPriority _priority = MailPriority.Normal;
  23. /// <summary>构造函数。</summary>
  24. public MailMessage() { }
  25. /// <summary>编码,默认为 UTF-8。</summary>
  26. public Encoding Encoding { get { return _encoding; } set { _encoding = value ?? Encoding.UTF8; } }
  27. /// <summary>附件。</summary>
  28. public Dictionary<string, byte[]> Attachment { get { return _attachment; } }
  29. /// <summary>发件人。</summary>
  30. public MailAddress Sender { get { return _sender; } set { _sender = value ?? new MailAddress(); } }
  31. /// <summary>收件人。</summary>
  32. public List<MailAddress> Receiver { get { return _receiver; } }
  33. /// <summary>抄送。</summary>
  34. public List<MailAddress> CarbonCopy { get { return _carboncopy; } }
  35. /// <summary>密送。</summary>
  36. public List<MailAddress> BlindCarbonCopy { get { return _blindcarboncopy; } }
  37. /// <summary>主题/标题。</summary>
  38. public string Title { get { return _title; } set { _title = TextUtility.Trim(value, true); } }
  39. /// <summary>正文/内容。</summary>
  40. public string Content { get { return _content; } set { _content = value ?? Constant.EmptyString; } }
  41. /// <summary>使用 HTML 格式,默认为 FALSE 值。</summary>
  42. public bool Html { get { return _html; } set { _html = value; } }
  43. /// <summary>优先级。</summary>
  44. public MailPriority Priority { get { return _priority; } set { _priority = value; } }
  45. /// <summary>获取 JSON 文本。</summary>
  46. public override string ToString()
  47. {
  48. return ToJson().ToString();
  49. }
  50. /// <summary>获取 JSON 对象。</summary>
  51. public Json ToJson()
  52. {
  53. var json = Json.NewObject();
  54. json["Priority"] = Priority.ToString();
  55. json["Encoding"] = Encoding.ToString();
  56. json["Title"] = Title;
  57. json["Content"] = Content;
  58. json["Html"] = Html.ToString();
  59. json.SetProperty("Sender", Json.From(Sender));
  60. var receiver = Json.NewArray();
  61. foreach (var account in _receiver) receiver.AddItem(Json.From(account));
  62. json.SetProperty("Receiver", receiver);
  63. var cc = Json.NewArray();
  64. foreach (var account in _carboncopy) receiver.AddItem(Json.From(account));
  65. json.SetProperty("CarbonCopy", cc);
  66. var bcc = Json.NewArray();
  67. foreach (var account in _blindcarboncopy) receiver.AddItem(Json.From(account));
  68. json.SetProperty("BlindCarbonCopy", bcc);
  69. var attachment = Json.NewArray();
  70. foreach (var kvp in _attachment)
  71. {
  72. var item = Json.NewObject();
  73. item["Name"] = TextUtility.Trim(kvp.Key);
  74. item["Base64"] = BytesUtility.ToBase64(kvp.Value);
  75. attachment.AddItem(item);
  76. }
  77. json.SetProperty("Attachment", attachment);
  78. return json;
  79. }
  80. internal System.Net.Mail.MailMessage ToInstance()
  81. {
  82. var mm = new System.Net.Mail.MailMessage();
  83. #if !NET20
  84. mm.HeadersEncoding = _encoding;
  85. #endif
  86. mm.SubjectEncoding = _encoding;
  87. mm.BodyEncoding = _encoding;
  88. if (_sender != null)
  89. {
  90. var ma = _sender.ToInstance(_encoding);
  91. if (ma != null) mm.From = ma;
  92. }
  93. foreach (var account in _receiver)
  94. {
  95. if (account == null) continue;
  96. var ma = account.ToInstance(_encoding);
  97. if (ma != null) mm.To.Add(ma);
  98. }
  99. foreach (var account in _carboncopy)
  100. {
  101. if (account == null) continue;
  102. var ma = account.ToInstance(_encoding);
  103. if (ma != null) mm.CC.Add(ma);
  104. }
  105. foreach (var account in _blindcarboncopy)
  106. {
  107. if (account == null) continue;
  108. var ma = account.ToInstance(_encoding);
  109. if (ma != null) mm.Bcc.Add(ma);
  110. }
  111. foreach (var attachment in _attachment)
  112. {
  113. var a = GetAttachment(attachment.Key, attachment.Value, _encoding);
  114. mm.Attachments.Add(a);
  115. }
  116. mm.Subject = _title;
  117. mm.Body = _content;
  118. mm.IsBodyHtml = _html;
  119. return mm;
  120. }
  121. private static System.Net.Mail.Attachment GetAttachment(string name, byte[] bytes, Encoding encoding)
  122. {
  123. if (TextUtility.IsBlank(name)) return null;
  124. var data = bytes;
  125. var memory = new MemoryStream();
  126. if (data != null)
  127. {
  128. if (data.Length > 0) memory.Write((byte[])data);
  129. }
  130. memory.ResetPosition();
  131. var attachment = new System.Net.Mail.Attachment(memory, TextUtility.Trim(name));
  132. attachment.NameEncoding = encoding;
  133. return attachment;
  134. }
  135. }
  136. }