ExchangeMailer.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using System.Net;
  2. using InABox.Core;
  3. using Microsoft.Exchange.WebServices.Data;
  4. namespace InABox.Mail
  5. {
  6. class ExchangeTraceListener : ITraceListener
  7. {
  8. public void Trace(string traceType, string traceMessage)
  9. {
  10. Logger.Send(LogType.Information, traceType, traceMessage);
  11. }
  12. }
  13. public class ExchangeMailer : CoreMailer<ExchangeMailFolder, ExchangeMailSummary, ExchangeMailMessage>
  14. {
  15. private ExchangeService Service;
  16. private ExchangeVersion Version = ExchangeVersion.Exchange2007_SP1;
  17. public IEnumerable<string> Versions()
  18. {
  19. var results = new List<string>();
  20. var values = Enum.GetValues(typeof(ExchangeVersion)).Cast<ExchangeVersion>();
  21. foreach (var value in values)
  22. results.Add(value.ToString());
  23. return results;
  24. }
  25. protected override void Initialize()
  26. {
  27. ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
  28. Version = Enum.GetValues(typeof(ExchangeVersion)).Cast<ExchangeVersion>().Min();
  29. }
  30. public override void Dispose()
  31. {
  32. if (Service != null)
  33. Service = null;
  34. }
  35. private static bool RedirectionUrlValidationCallback(string redirectionUrl)
  36. {
  37. // The default for the validation callback is to reject the URL.
  38. bool result = false;
  39. Uri redirectionUri = new Uri(redirectionUrl);
  40. // Validate the contents of the redirection URL. In this simple validation
  41. // callback, the redirection URL is considered valid if it is using HTTPS
  42. // to encrypt the authentication credentials.
  43. if (redirectionUri.Scheme == "https")
  44. {
  45. result = true;
  46. }
  47. return result;
  48. }
  49. protected override bool DoConnect()
  50. {
  51. try
  52. {
  53. Service = new ExchangeService(Version);
  54. Service.Timeout = 10000;
  55. Service.TraceListener = new ExchangeTraceListener();
  56. Service.TraceFlags = TraceFlags.All;
  57. Service.TraceEnabled = true;
  58. if (String.IsNullOrWhiteSpace(MailboxDomain))
  59. {
  60. if (String.IsNullOrWhiteSpace(MailboxUserName))
  61. Service.UseDefaultCredentials = true;
  62. else
  63. {
  64. Service.Credentials = new WebCredentials(MailboxUserName, MailboxPassword);
  65. if (String.IsNullOrWhiteSpace(MailboxHost))
  66. Service.AutodiscoverUrl(MailboxUserName,RedirectionUrlValidationCallback);
  67. else
  68. Service.Url = new Uri($"https://{MailboxHost}:{(MailboxPort == 0 ? 443 : MailboxPort)}/EWS/Exchange.asmx");
  69. var folder = Folder.Bind(Service, WellKnownFolderName.Inbox).ConfigureAwait(true);
  70. }
  71. }
  72. else
  73. {
  74. Service.Credentials = new WebCredentials(MailboxUserName, MailboxPassword, MailboxDomain);
  75. Service.Url = new Uri(string.Format("https://{0}:{1}/EWS/Exchange.asmx", MailboxHost, MailboxPort == 0 ? 443 : MailboxPort));
  76. }
  77. return true;
  78. }
  79. catch (Exception err)
  80. {
  81. Service = null;
  82. return false;
  83. }
  84. }
  85. protected override bool GetIsConnected()
  86. {
  87. return Service != null;
  88. }
  89. protected override bool DoSendMessage(ExchangeMailMessage message)
  90. {
  91. var result = false;
  92. if (IsConnected)
  93. {
  94. var email = new EmailMessage(Service);
  95. if (message.To != null)
  96. email.ToRecipients.AddRange(message.To.Select(x => new EmailAddress(x)));
  97. if (message.CC != null)
  98. email.CcRecipients.AddRange(message.CC.Select(x => new EmailAddress(x)));
  99. if (message.BCC != null)
  100. email.BccRecipients.AddRange(message.BCC.Select(x => new EmailAddress(x)));
  101. email.Subject = message.Subject;
  102. email.Body = new MessageBody(BodyType.Text, message.Body);
  103. email.SendAndSaveCopy();
  104. result = true;
  105. }
  106. return result;
  107. }
  108. protected override ExchangeMailFolder DoFindFolder(ExchangeMailFolder parent, string name)
  109. {
  110. FindFoldersResults results = null;
  111. if (parent == null)
  112. results = Service.FindFolders(WellKnownFolderName.Inbox, new FolderView(int.MaxValue)).Result;
  113. else
  114. results = Service.FindFolders(parent.Folder.Id, new FolderView(int.MaxValue)).Result;
  115. var result = results.FirstOrDefault(x => x.DisplayName.Equals(name));
  116. return new ExchangeMailFolder(result);
  117. }
  118. protected override ExchangeMailFolder GetInbox()
  119. {
  120. var folder = Folder.Bind(Service, WellKnownFolderName.Inbox).Result;
  121. return new ExchangeMailFolder(folder);
  122. }
  123. protected override ExchangeMailFolder GetSentItems()
  124. {
  125. var folder = Folder.Bind(Service, WellKnownFolderName.SentItems).Result;
  126. return new ExchangeMailFolder(folder);
  127. }
  128. protected override ExchangeMailMessage DoGetMessage(ExchangeMailFolder folder, string id)
  129. {
  130. throw new NotImplementedException();
  131. }
  132. protected override IEnumerable<ExchangeMailMessage> DoGetMessages(ExchangeMailFolder folder)
  133. {
  134. var parent = folder != null ? folder.Folder : Service.FindFolders(WellKnownFolderName.Inbox, new FolderView(1)).Result.FirstOrDefault();
  135. if (parent != null)
  136. {
  137. FindItemsResults<Item> items = parent.FindItems(new ItemView(int.MaxValue)).Result;
  138. var results = new List<ExchangeMailMessage>();
  139. foreach (var item in items)
  140. try
  141. {
  142. var message = EmailMessage.Bind(Service, item.Id).Result;
  143. results.Add(new ExchangeMailMessage(message));
  144. }
  145. catch (Exception e)
  146. {
  147. }
  148. return results;
  149. }
  150. return null;
  151. }
  152. protected override IEnumerable<ExchangeMailSummary> DoListMessages(ExchangeMailFolder folder, int min = 0, int max = int.MaxValue)
  153. {
  154. throw new NotImplementedException();
  155. }
  156. protected override ExchangeMailMessage DoCreateMessage()
  157. {
  158. var email = new EmailMessage(Service);
  159. return new ExchangeMailMessage(email);
  160. }
  161. protected override bool DoMoveMessage(ExchangeMailMessage message, ExchangeMailFolder to)
  162. {
  163. if (message != null && to != null)
  164. {
  165. message.Message.Move(to.Folder.Id);
  166. return true;
  167. }
  168. return false;
  169. }
  170. protected override bool DoSaveDraft(ExchangeMailMessage message)
  171. {
  172. message.Message.Save(WellKnownFolderName.Drafts);
  173. return true;
  174. }
  175. }
  176. }
  177. // internal class ExchangeVersion
  178. // {
  179. // }