/// <summary> /// Helper for connecting to Exchange service. /// </summary> /// <param name="settings">Exchange server related settings</param> /// <returns></returns> public static ExchangeService ConnectToExchangeService(ExchangeSettings settings) { ExchangeVersion ev; var office365 = false; switch (settings.ExchangeServerVersion) { case ExchangeServerVersion.Exchange2007_SP1: ev = ExchangeVersion.Exchange2007_SP1; break; case ExchangeServerVersion.Exchange2010: ev = ExchangeVersion.Exchange2010; break; case ExchangeServerVersion.Exchange2010_SP1: ev = ExchangeVersion.Exchange2010_SP1; break; case ExchangeServerVersion.Exchange2010_SP2: ev = ExchangeVersion.Exchange2010_SP2; break; case ExchangeServerVersion.Exchange2013: ev = ExchangeVersion.Exchange2013; break; case ExchangeServerVersion.Exchange2013_SP1: ev = ExchangeVersion.Exchange2013_SP1; break; case ExchangeServerVersion.Office365: ev = ExchangeVersion.Exchange2013_SP1; office365 = true; break; default: ev = ExchangeVersion.Exchange2013; break; } var service = new ExchangeService(ev); // SSL certification check. ServicePointManager.ServerCertificateValidationCallback = ExchangeCertificateValidationCallBack; if (!office365) { if (string.IsNullOrWhiteSpace(settings.Username)) { service.UseDefaultCredentials = true; } else { service.Credentials = new NetworkCredential(settings.Username, settings.Password); } } else { service.Credentials = new WebCredentials(settings.Username, settings.Password); } if (settings.UseAutoDiscover) { service.AutodiscoverUrl(settings.Username, RedirectionUrlValidationCallback); } else { service.Url = new Uri(settings.ServerAddress); } return(service); }
/// <summary> /// Reads emails from an Exchange server. Can be used only on legacy (Windows) agents. /// </summary> /// <param name="settings">Settings to use</param> /// <param name="options">Options to use</param> /// <returns> /// List of /// { /// string Id. /// string To. /// string Cc. /// string From. /// DateTime Date. /// string Subject. /// string BodyText. /// string BodyHtml. /// List(string) AttachmentSaveDirs /// } /// </returns> public static List <EmailMessageResult> ReadEmailFromExchangeServer([PropertyTab] ExchangeSettings settings, [PropertyTab] ExchangeOptions options) { #if NET471 if (!options.IgnoreAttachments) { // Check that save directory is given if (options.AttachmentSaveDirectory == "") { throw new ArgumentException("No save directory given. ", nameof(options.AttachmentSaveDirectory)); } // Check that save directory exists if (!Directory.Exists(options.AttachmentSaveDirectory)) { throw new ArgumentException("Could not find or access attachment save directory. ", nameof(options.AttachmentSaveDirectory)); } } // Connect, create view and search filter ExchangeService exchangeService = Services.ConnectToExchangeService(settings); ItemView view = new ItemView(options.MaxEmails); var searchFilter = BuildFilterCollection(options); FindItemsResults <Item> exchangeResults; if (!string.IsNullOrEmpty(settings.Mailbox)) { var mb = new Mailbox(settings.Mailbox); var fid = new FolderId(WellKnownFolderName.Inbox, mb); var inbox = Folder.Bind(exchangeService, fid); exchangeResults = searchFilter.Count == 0 ? inbox.FindItems(view) : inbox.FindItems(searchFilter, view); } else { exchangeResults = searchFilter.Count == 0 ? exchangeService.FindItems(WellKnownFolderName.Inbox, view) : exchangeService.FindItems(WellKnownFolderName.Inbox, searchFilter, view); } // Get email items List <EmailMessage> emails = exchangeResults.Where(msg => msg is EmailMessage).Cast <EmailMessage>().ToList(); // Check if list is empty and if an error needs to be thrown. if (emails.Count == 0 && options.ThrowErrorIfNoMessagesFound) { // If not, return a result with a notification of no found messages. throw new ArgumentException("No messages matching the search filter found. ", nameof(options.ThrowErrorIfNoMessagesFound)); } // Load properties for each email and process attachments var result = ReadEmails(emails, exchangeService, options); // should delete mails? if (options.DeleteReadEmails) { emails.ForEach(msg => msg.Delete(DeleteMode.HardDelete)); } // should mark mails as read? if (!options.DeleteReadEmails && options.MarkEmailsAsRead) { foreach (EmailMessage msg in emails) { msg.IsRead = true; msg.Update(ConflictResolutionMode.AutoResolve); } } return(result); #else throw new Exception("Only supported on .NET Framework (i.e. on Windows)."); #endif }