/// <summary>
        /// For each specified sahred mailbox, if the user has access to the mailbox, 
        /// items matching the search term are sought-out. Each of the specified folders in the user's personal mailbox are also searched.
        /// </summary>
        /// <param name="credentials">The user credntials to impersonate in the mail system.</param>
        /// <param name="sharedMailBoxNames">The names of the shared mailboxes to search.</param>
        /// <param name="mailFolderNames">The names of the folders in the user's personal mail box to search.</param>
        /// <param name="searchTerm">The term that results must contain. This is case insensitive.</param>
        /// <returns>Mail items that match the search term or an empty result (i.e. never null).</returns>
        public IEnumerable<MailItem> FindItems(MailBoxCredentials credentials,
            MailSearchContainerNameList sharedMailBoxNames,
            MailSearchContainerNameList mailFolderNames,
            string searchTerm)
        {
            if (credentials == null
                || String.IsNullOrEmpty(credentials.UserName))
            {
                throw new UnauthorizedAccessException("No user to impersonate specified.");
            }

            var result = new List<MailItem>();
            if (String.IsNullOrEmpty(searchTerm)
                || ((sharedMailBoxNames == null
                     || sharedMailBoxNames.Count <= 0)
                    && (mailFolderNames == null
                     || mailFolderNames.Count <= 0)))
            {
                return result;
            }

            var ewsURL = configuration.EWSURL;
            var networkDomain = configuration.EWSNetworkDomain;
            var networkUserName = configuration.EWSNetworkUserName;
            var networkPassword = configuration.EWSNetworkPassword;
            var mailDomain = configuration.MailDomain;
            var searchFilters = new Microsoft.Exchange.WebServices.Data.SearchFilter.SearchFilterCollection (LogicalOperator.Or,
                    new SearchFilter[5]{new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Subject, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Sender, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, searchTerm),
                                        new SearchFilter.ContainsSubstring(EmailMessageSchema.Attachments, searchTerm)
                                        });
            var service = ConfigureMSExchangeService(networkUserName,
                                                     networkPassword,
                                                     networkDomain,
                                                     ewsURL,
                                                     credentials);
            var iv = new ItemView(VIEW_SIZE);
            iv.PropertySet = new PropertySet(BasePropertySet.IdOnly,
                                            ItemSchema.Subject,
                                            ItemSchema.DateTimeReceived);

            var shareMailBoxMatches = SearchSharedMailBoxes(service,
                                                            iv,
                                                            searchFilters,
                                                            sharedMailBoxNames,
                                                            configuration.MailDomain,
                                                            searchTerm);
            if (sharedMailBoxNames != null) result.AddRange(shareMailBoxMatches);
            var mailFolderMatches = SearchMailFolders(service,
                                                     iv,
                                                     searchFilters,
                                                     mailFolderNames,
                                                     searchTerm);
            if (mailFolderMatches != null) result.AddRange(mailFolderMatches);

            return result;
        }
 public void TestHandlesNoPersonalMailFolders()
 {
     var credentials = new MailBoxCredentials
     {
         UserName = "******",
         DomainName = "entemea.google.com"
     };
     var sharedMailBoxes = new MailSearchContainerNameList(new string[1] { "" });
     _target.FindItems(credentials, sharedMailBoxes, null, null);
 }
 public void TestHandlesNoSearchTerm()
 {
     var credentials = new MailBoxCredentials
     {
         UserName = "******",
         DomainName = "entemea.google.com"
     };
     var sharedMailBoxes = new MailSearchContainerNameList(new string[2] { "sharedmailbox", "ghdsharedtest" });
     var personalMailFolders = new MailSearchContainerNameList(new string[1] { "InBox" });
     _target.FindItems(credentials, sharedMailBoxes, personalMailFolders, null);
 }
        public void TestCanRequestMailSearch()
        {
            var expectedMailBoxCredentials = new MailBoxCredentials{UserName = TEST_USER_NAME, DomainName = TEST_DOMAIN };
            var searchTerm = "quote";

            Expect.Call(msxConnector.FindItems(expectedMailBoxCredentials,
                                               TEST_SHARED_MAILBOX_NAMES,
                                               TEST_MAIL_FOLDER_NAMES,
                                               searchTerm))
                  .Return(null);

            mocks.ReplayAll();

            var results = target.SearchForMail(searchTerm, TEST_USER_NAME);
        }
        private ExchangeService ConfigureMSExchangeService(string networkUserName,
            string networkPassword,
            string networkDomain,
            string serviceURL,
            MailBoxCredentials impersonationCredentials)
        {
            ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallback;
            var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
            service.Credentials = new NetworkCredential(networkUserName,
                                                        networkPassword,
                                                        networkDomain);
            service.Url = new System.Uri(serviceURL);
            service.ImpersonatedUserId = new ImpersonatedUserId
            {
                Id = String.Format("{0}@{1}", impersonationCredentials.UserName, impersonationCredentials.DomainName),
                                   IdType = ConnectingIdType.SmtpAddress };

            return service;
        }
 public void TestSearchesSharedMailBoxes()
 {
     var credentials = new MailBoxCredentials
     {
         UserName = "******",
         DomainName = "entemea.google.com"
     };
     var searchTerm = "test";
     var sharedMailBoxes = new MailSearchContainerNameList(new string[2] { "sharedmailbox", "ghdsharedtest" });
     _target.FindItems(credentials, sharedMailBoxes, null, searchTerm);
 }
 public void TestSearchesMailFolders()
 {
     var credentials = new MailBoxCredentials
     {
         UserName = "******",
         DomainName = "entemea.google.com"
     };
     var searchTerm = "test";
     MailSearchContainerNameList sharedMailBoxes = null;
     var mailFolderNames = new MailSearchContainerNameList(new string[1] { "Inbox" });
     _target.FindItems(credentials, sharedMailBoxes, mailFolderNames, searchTerm);
 }
 public void TestHandlesNoSharedMailBoxes()
 {
     var credentials = new MailBoxCredentials { UserName="******",
                                                DomainName = "entemea.google.com"};
     _target.FindItems(credentials, null, null, null);
 }
 public void TestDoesNotAllowEmptyCredentials()
 {
     var credentials = new MailBoxCredentials();
     _target.FindItems(credentials, null, null, null);
 }