Esempio n. 1
0
        /// <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
        }