IMAPMailMessage.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using MailKit;
  2. using MimeKit;
  3. namespace InABox.Mail
  4. {
  5. public class IMAPMailSummary : ICoreMailSummary
  6. {
  7. private IMAPMailSummary()
  8. {
  9. }
  10. public IMAPMailSummary(IMailFolder folder, IMessageSummary summary)
  11. {
  12. Folder = folder;
  13. Summary = summary;
  14. }
  15. public IMailFolder Folder { get; }
  16. public IMessageSummary Summary { get; }
  17. public string ID => Summary.UniqueId.ToString();
  18. public DateTime Date => Summary.Envelope.Date.HasValue ? Summary.Envelope.Date.Value.LocalDateTime : DateTime.MinValue;
  19. public string From
  20. {
  21. get => Summary.Envelope.From.Any() ? ((MailboxAddress)Summary.Envelope.From.First()).Address : "";
  22. set
  23. {
  24. Summary.Envelope.From.Clear();
  25. Summary.Envelope.From.Add(MailboxAddress.Parse(value));
  26. }
  27. }
  28. public string Subject
  29. {
  30. get => Summary.Envelope.Subject;
  31. set => Summary.Envelope.Subject = value;
  32. }
  33. public IEnumerable<string> To
  34. {
  35. get { return Summary.Envelope.To.Select(x => ((MailboxAddress)x).Address); }
  36. set
  37. {
  38. Summary.Envelope.To.Clear();
  39. Summary.Envelope.To.AddRange(value.Select(x => MailboxAddress.Parse(x)));
  40. }
  41. }
  42. }
  43. public class IMAPMailMessage : ICoreMailMessage
  44. {
  45. private Tuple<string, byte[]>[] _attachments = { };
  46. private string _body = "";
  47. private bool _ishtml;
  48. private IMAPMailMessage()
  49. {
  50. }
  51. public IMAPMailMessage(IMailFolder folder, UniqueId uniqueid, MimeMessage message)
  52. {
  53. Folder = folder;
  54. UniqueID = uniqueid;
  55. Message = message;
  56. Summary = null;
  57. _body = message.HtmlBody;
  58. }
  59. public IMAPMailMessage(IMailFolder folder, UniqueId uniqueid, IMessageSummary summary)
  60. {
  61. Folder = folder;
  62. UniqueID = uniqueid;
  63. Message = null;
  64. Summary = summary;
  65. }
  66. public IMailFolder Folder { get; set; }
  67. public UniqueId UniqueID { get; private set; }
  68. public MimeMessage Message { get; }
  69. public IMessageSummary Summary { get; }
  70. public void Save()
  71. {
  72. if (UniqueID != UniqueId.MinValue)
  73. Folder.SetFlags(UniqueID, MessageFlags.Deleted, true);
  74. UniqueID = Folder.Append(Message).Value;
  75. Folder.SetFlags(UniqueID, MessageFlags.Seen, true);
  76. }
  77. public string ID
  78. {
  79. get => Message.MessageId;
  80. set => Message.MessageId = value;
  81. }
  82. public DateTime Date
  83. {
  84. get => Message.Date.DateTime;
  85. set => Message.Date = new DateTimeOffset(value);
  86. }
  87. public string From
  88. {
  89. get => (Message.From.First() as MailboxAddress).Address;
  90. set
  91. {
  92. Message.From.Clear();
  93. Message.From.Add(InternetAddress.Parse(value));
  94. }
  95. }
  96. public IEnumerable<string> To
  97. {
  98. get { return Message.To.Select(x => (x as MailboxAddress).Address); }
  99. set
  100. {
  101. Message.To.Clear();
  102. Message.To.AddRange(value.Select(x => InternetAddress.Parse(x)));
  103. }
  104. }
  105. public IEnumerable<string> CC
  106. {
  107. get { return Message.Cc.Select(x => (x as MailboxAddress).Address); }
  108. set
  109. {
  110. Message.Cc.Clear();
  111. Message.Cc.AddRange(value.Select(x => InternetAddress.Parse(x)));
  112. }
  113. }
  114. public IEnumerable<string> BCC
  115. {
  116. get { return Message.Bcc.Select(x => (x as MailboxAddress).Address); }
  117. set
  118. {
  119. Message.Bcc.Clear();
  120. Message.Bcc.AddRange(value.Select(x => InternetAddress.Parse(x)));
  121. }
  122. }
  123. public string Subject
  124. {
  125. get => Message.Subject;
  126. set => Message.Subject = value;
  127. }
  128. public IEnumerable<Tuple<string, byte[]>> Attachments
  129. {
  130. get => _attachments;
  131. set
  132. {
  133. _attachments = value.ToArray();
  134. UpdateMessage();
  135. }
  136. }
  137. public string Body
  138. {
  139. get => _body;
  140. set
  141. {
  142. _body = value;
  143. UpdateMessage();
  144. }
  145. }
  146. public bool IsHTML
  147. {
  148. get => _ishtml;
  149. set
  150. {
  151. _ishtml = value;
  152. UpdateMessage();
  153. }
  154. }
  155. public void Move(IMailFolder to)
  156. {
  157. if (UniqueID == UniqueId.MinValue)
  158. UniqueID = to.Append(Message).Value;
  159. else
  160. UniqueID = Folder.MoveTo(UniqueID, to).Value;
  161. Folder = to;
  162. }
  163. private void UpdateMessage()
  164. {
  165. var builder = new BodyBuilder();
  166. if (_ishtml)
  167. builder.HtmlBody = _body;
  168. else
  169. builder.TextBody = _body;
  170. if (_attachments != null)
  171. foreach (var attachment in _attachments)
  172. builder.Attachments.Add(attachment.Item1, attachment.Item2);
  173. Message.Body = builder.ToMessageBody();
  174. }
  175. }
  176. }