Обнаружить перемещение электронной почты с помощью управляемого API веб-службы Exchange?

Я использую управляемый API EWS и C#.

Я хочу знать, можно ли определить, когда электронное письмо перемещается в другую папку.

Это то, что у меня есть до сих пор:

static void SetPullNotifications(ExchangeService service)
{

    PullSubscription subscription = service.SubscribeToPullNotificationsOnAllFolders(
      5, null,
      EventType.Moved, EventType.Deleted, EventType.Copied, EventType.Modified);

    GetEventsResults events = subscription.GetEvents();

    foreach (ItemEvent itemEvent in events)
    {
        switch (itemEvent.EventType)
        {
            case EventType.Moved:
                MessageBox.Show("Item Moved :" + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Deleted:
                MessageBox.Show("Item deleted: " + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Copied:
                MessageBox.Show("Item Copied :" + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Modified:
                MessageBox.Show("Item Modified :" + itemEvent.ItemId.UniqueId);
                break;
        }
    }
}

Это отлично работает, если я ставлю точку останова на метод GetEvents(), а затем перемещаю электронное письмо. Но без точки останова не работает. events не содержит результатов.

Любые идеи ?


person Stephane Bintein    schedule 19.06.2013    source источник


Ответы (3)


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

Чтобы ваш код работал, вы должны сделать 2 вещи. Во-первых: создайте подписку при запуске приложения и сохраните ссылку на нее. Во втором магазине водяной знак вы получаете по подписке и перезагружаете его при запуске приложения. Может быть так:

static PullSubscription s_Subscription;

static void Main()
{
    ExchangeService service = CreateService();
    CreateSubsciption(service);
    //DoSomething;
    GetEvents();
    //DoSomething;
    StoreWatermark(s_Subscription.Watermark);
}

static void CreateSubscription(ExchangeService Service)
{
    string watermarkt = LoadWatermark(); 
    s_Subscription = service.SubscribeToPullNotificationsOnAllFolders(
        5, watermark,
        EventType.Moved, EventType.Deleted, EventType.Copied, EventType.Modified);

}

static void GetEvents()
{

    GetEventsResults events = subscription.GetEvents();

    foreach (ItemEvent itemEvent in events)
    {
        switch (itemEvent.EventType)
        {
            case EventType.Moved:
                MessageBox.Show("Item Moved :" + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Deleted:
                MessageBox.Show("Item deleted: " + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Copied:
                MessageBox.Show("Item Copied :" + itemEvent.ItemId.UniqueId);
                break;
            case EventType.Modified:
                MessageBox.Show("Item Modified :" + itemEvent.ItemId.UniqueId);
                break;

        }
    }
}
person Jürgen Hoffmann    schedule 21.06.2013

Вы можете использовать потоковые уведомления с EWS для прослушивания изменений элементов на сервере Exchange. Вот пример того, как настроить потоковые уведомления:

http://blogs.msdn.com/b/exchangedev/archive/2010/12/22/working-with-streaming-notifications-by-using-the-ews-managed-api.aspx

В вашем случае вы должны обрабатывать EventType.Moved. Когда вы обрабатываете события, вам предоставляется объект типа ItemEvent (как показано в приведенном выше примере), который имеет два свойства OldParentFolderId и ParentFolderId, которые определяют папку, из которой и в которую был перемещен элемент.

person Jakob Christensen    schedule 19.06.2013
comment
Спасибо за Ваш ответ. К сожалению, я работаю в службе Exchange 2010, а не в SP1. Я пробовал что-то вроде этого, но с «PullSubscription», но когда я пытаюсь «GetEvents()», у меня ничего не получается. - person Stephane Bintein; 19.06.2013
comment
@StephaneBintein: я использую PullSubscriptions, как и вы, и все работает нормально. Вам нужно будет получить список всех папок в почтовом ящике, за которым вы наблюдаете. И чем это работает нормально. Ваш код должен выглядеть примерно так: List‹FolderId›folders = GetAllFolderIds(); подписка = service.SubscribeToPullNotifications (папки, 1440, водяной знак, EventType.Moved); GetEventsResults currentevents = Subscription.GetEvents(); Если почта перемещается между вашей подпиской и вызовом GetEvents(), перемещение включается. - person Jürgen Hoffmann; 20.06.2013
comment
@JürgenHoffmann: Я думаю, вам следует добавить свой комментарий в качестве ответа, чтобы ОП мог пометить его как правильный ответ. - person Jakob Christensen; 20.06.2013

Причина, по которой ваш код не работает, проста. нет времени, чтобы События могли произойти. Вы создаете подписку, которая будет распознавать только события того момента, когда вы ее создаете, потому что водяной знак недействителен. Только через одну строку, так что, скажем, через миллисекунду вы спросите подписку: «Эй, было ли какое-либо событие за последнюю миллисекунду?» И ответ нет". Создайте свою подписку при запуске программы и вызовите getevents по таймеру, может быть, через 5 минут. И если у вас было какое-либо событие за последние пять минут, появится ваше окно сообщений.

person Jürgen Hoffmann    schedule 17.07.2013