2013-08-08 10 views
9

Używam usług internetowych Exchange do łączenia się ze skrzynką pocztową i wyszukiwania wiadomości spełniających określone kryteria, używając FindItems z SearchFilter.Usługi internetowe Exchange: wyszukiwanie wiadomości e-mail wysyłanych do adresata

mogę dostać e-maile w skrzynce filtrowanie na „z” adres e-mail tak:

var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1) 
      { 
       TraceEnabled = true, 
       Credentials = new WebCredentials(username, password) 
      }; 

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "[email protected]"); 

service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(50)) 

I mogę filtrować na posesji DisplayTo jak ten:

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.DisplayTo, "display name"); 

Ale o ile Mogę powiedzieć, że tylko przeszukuje wyświetlaną nazwę odbiorcy. Chcę wyszukać na adres e-mail lub nazwę domeny.

To nie zwraca wyników, kiedy będę oczekiwać, że:

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, "[email protected]"); 

Czy to możliwe, aby znaleźć wszystkie wiadomości e-mail, na który lista odbiorców zawiera określonego adresu e-mail?

+0

Wygląda jak ten problem nadal istnieje w EWS API 2.2. Czy znalazłeś jakieś obejście? – 02Anant

+0

@ 02Anant Moim rozwiązaniem było użycie FindItems z ciągiem zapytania, pokazanym w mojej odpowiedzi i opisanym tutaj https://msdn.microsoft.com/en-us/library/ee693615.aspx – mattk

Odpowiedz

4

Nie mogę znaleźć drogę do korzystania z SearchFilter znaleźć e-maile w oparciu o adres e-mail odbiorcy.

Jest to możliwe przy użyciu innego przeciążenia obiektu ExchangeService.FindItems, który pobiera zapytanie.

Znalezienie maile gdy adres znajduje się w polu Do lub DW

var contactEmailAddress = "[email protected]"; 

var querystring = string.Format("Participants:={0}", contactEmailAddress); 

service.FindItems(WellKnownFolderName.Inbox, queryString, view); 

Znalezienie maile gdzie adres jest w Z, lub pól DW

var contactEmailAddress = "[email protected]"; 

var querystring = string.Format("(From:={0} OR Participants:={0})", contactEmailAddress); 

service.FindItems(WellKnownFolderName.Inbox, queryString, view); 

myślę ta funkcja wymaga Exchange 2010.

Niektóre dodatkowe środki na składni zapytań:

5

Może to być spowodowane tym, że nie masz dostępu do właściwego folderu, tj .: wysłane elementy.

Wymień

service.FindItems(WellKnownFolderName.Inbox, filter, new ItemView(50)) 

Przez

service.FindItems(WellKnownFolderName.SentItems, filter, new ItemView(50)) 

EDIT: źle początkowe pytanie. Może warto przyjrzeć się następującym MSDN blogu: http://blogs.msdn.com/b/akashb/archive/2010/03/05/how-to-build-a-complex-search-using-searchfilter-and-searchfiltercollection-in-ews-managed-api-1-0.aspx Wyjaśnia, jak zrobić złożonych wyszukiwań za pomocą EWS

+1

To nie jest problem. Folder skrzynki odbiorczej zawiera wiadomości e-mail, które należy pobrać za pomocą EWS. W skrzynce odbiorczej można znaleźć e-maile, ale nie można ich filtrować według adresu odbiorcy przy użyciu funkcji API SearchFilter. – mattk

+0

Zmieniono moją odpowiedź – Fabien

+0

Dzięki @Fabien, Tak, a następnie zorientowałem się, że problem z INBOX => SENTITEMS, ale nadal nie mogę odfiltrować wiadomości e-mail wysłanych do określonego odbiorcy z folderu SentItems. Sprawdziłem twój link, daje on możliwość wyszukiwania przez ==,! =, <, > itd., Ale nie podoba mi się in_array. Potrzebuję tutaj czegoś takiego, jak sprawdzić, czy adres e-mail istnieje w RecipientsArray. czy możesz mnie poprowadzić? –

1

Należy pamiętać, że nie można przedłużyć FindItems metodę lub FindItem operacja pobierać dodatkowe właściwości i elementy takie jak do Odbiorcy, CcRecipients i BccRecipients. Aby odzyskać te wartości, należy użyć metody FindItems lub operacji FindItem, aby uzyskać identyfikatory elementów wiadomości e-mail, a następnie użyć metody Bind lub operacji GetItem w celu pobrania wymaganych właściwości. Ref: MSDN Email properties

Oto jak to zrobiłem:

ItemView view = new ItemView(200); 
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.DateTimeSent); 

    List<SearchFilter> searchFilterCollection = new List<SearchFilter>(); 
    searchFilterCollection.Add(new SearchFilter.IsGreaterThanOrEqualTo(EmailMessageSchema.DateTimeSent, LastServiceRun)); //Fetching recently sent emails 
    //In case you want to have more than one filter  
    SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection); 

    FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.SentItems, searchFilter, view); 

    foreach (Microsoft.Exchange.WebServices.Data.EmailMessage item in results) 
    { 
     PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.ToRecipients); 

     EmailMessage sentEmail = (EmailMessage)Item.Bind(service, item.Id, propSet); 

     if (sentEmail.ToRecipients.Any(sEmail => sEmail.Address == mySearchEmailAddress)) 
     { 
      //An email found where an address is in the To field - Your logic comes here 
     } 

    }` 
Powiązane problemy