Получить ItemId следующего сообщения с указанным ItemId текущего сообщения с помощью управляемого API веб-служб Exchange (EWS) - PullRequest
0 голосов
/ 04 августа 2010

Мне нужно написать метод в C #, который использует управляемый API-интерфейс Exchange Web Services (EWS) для чтения электронных писем из почтового ящика и, учитывая ItemId / UniqueId текущего электронного письма, возвращает ItemId / UniqueId следующего электронного письма вВходящие после текущей электронной почты.

Кроме того, по разным причинам я требую, чтобы метод был статическим методом без сохранения состояния, то есть он не может полагаться на какие-либо глобальные переменные-члены, которые сохраняются между вызовами метода.Таким образом, я не могу просто сохранить ссылку на экземпляр объекта FindItemsResults и переходить к следующему элементу при каждом вызове метода.

Я попытался реализовать метод с использованием следующего кода (только в упрощенном примере,без проверки ошибок):

using Microsoft.Exchange.WebServices;
using Microsoft.Exchange.WebServices.Data;
...
...
public string GetNextEmailId(string currentItemId)
{
    // set up Exchange Web Service connection
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
    service.AutodiscoverUrl("example.user@contoso.com");
    // create SearchFilter to find next email after current email
    ItemId itemId = new ItemId(currentItemId);
    SearchFilter sfNextEmail = new SearchFilter.IsGreaterThan(EmailMessageSchema.Id, itemId);
    // find next email in inbox
    ItemView itemView = new ItemView(1);
    itemView.OrderBy.Add(EmailMessageSchema.DateTimeReceived, SortDirection.Ascending);
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sfNextEmail, itemView);
    // return unique ID of next email
    return findResults.Items[0].Id.UniqueId;
}

Однако, когда я запускаю этот метод, он выдает следующее исключение из строки service.FindItems:

System.ArgumentException: «Проверка не удалась. Имя параметра: searchFilter«
Внутреннее исключение - Microsoft.Exchange.WebServices.Data.ServiceValidationException:« Значения типа «ItemId» не могут быть значениями сравнения в поисковых фильтрах ».

Один из вариантов - использовать FindItems, чтобы найти все электронные письма в папке «Входящие» и выполнить их проверку, проверяя ItemId до тех пор, пока я не найду текущее письмо, а затем перейти к следующему и вернуть его уникальный идентификатор.Но я думаю, что это будет медленно и неэффективно.Я надеюсь, что есть лучший способ достичь этого.

Любая помощь или предложения будут с благодарностью.Мне не удалось найти какие-либо решения для поиска в Интернете.

1 Ответ

6 голосов
/ 11 августа 2010

Если вы знаете идентификатор элемента текущего электронного письма, вы можете связать его с ним:

EmailMessage current = EmailMessage.Bind (service, id);

Тогда у вас есть текущая дата получения электронных писем - создайте фильтр поиска для всех дат, превышающих эту, и используйте ваш заказ по коду, который у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...