Веб-службы Exchange: поиск писем, отправленных получателю

Я использую веб-службы Exchange для подключения к почтовому ящику и поиска сообщений, соответствующих определенным критериям, используя в разделе finditems С SearchFilter.

Я могу получить электронные письма в фильтрации почтовых ящиков на " от " адрес электронной почты, как это:

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

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.From, "some@email.com");

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

и я могу фильтровать на DisplayTo вот так:

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

но, насколько я могу судить, это только поиск отображаемого имени получателя. Я хочу искать по адресу электронной почты или доменное имя.

это не возвращает результаты, когда я ожидал бы этого:

var filter = new SearchFilter.ContainsSubstring(EmailMessageSchema.ToRecipients, "some@email.com");

можно ли найти все письма, где список получателей содержит определенный адрес электронной почты?

3 ответов


это может быть потому, что вы не получаете доступ к правильной папке, то есть: отправленные элементы.

заменить

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

By

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

Edit: я неправильно понял первоначальный вопрос. Возможно, вам стоит взглянуть на следующий блог MSDN: 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 Это объясняет, как сделать сложные поиски с помощью EWS


Я не нашел способ использовать SearchFilter для поиска писем на основе адреса электронной почты получателя.

возможно использование другой перегрузки ExchangeService.FindItems, который принимает строку запроса.

поиск электронных писем, где адрес находится в полях To или Cc

var contactEmailAddress = "some@email.com";

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

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

поиск писем, где адрес находится в полях От, До или Cc

var contactEmailAddress = "some@email.com";

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

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

Я думаю, что эта функция требует обмен 2010.

некоторые дополнительные ресурсы на синтаксис:


обратите внимание, что вы не можете расширить в разделе finditems способ или метод finditem операции для получения дополнительных свойств и элементов, таких как ToRecipients, CcRecipients и BccRecipients. Если необходимо получить эти значения, используйте метод FindItems или операцию FindItem для получения идентификаторов элементов электронной почты, а затем используйте метод Bind или операцию GetItem для получения необходимых свойств. Ссылка: свойства электронной почты MSDN

вот как я сделал это:

 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
        }

    }`