1

我正在使用 EWS 托管 API 和 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不包含任何结果。

有任何想法吗 ?

4

3 回答 3

3

你在正确的方式,但你错过了一些东西。您的代码将仅获取在创建订阅和获取事件之间发生的事件,这就是它仅适用于断点的原因。

要使您的代码正常工作,您应该做两件事。首先:在启动应用程序时创建订阅并保留引用。在第二存储您从订阅中获得的水印并在应用程序启动时重新加载它。也许是这样的:

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;

        }
    }
}
于 2013-06-21T07:00:07.240 回答
1

您可以将流式通知与 EWS 一起使用,以侦听 Exchange Server 上项目的更改。以下是有关如何设置流式通知的示例:

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

在您的情况下,您应该处理该EventType.Moved事件。当您处理事件时,您将获得一个类型的对象ItemEvent(如上例所示),该对象具有两个属性OldParentFolderIdParentFolderId用于标识项目从哪个文件夹移动到哪个文件夹。

于 2013-06-19T11:57:37.117 回答
0

原因,为什么你的代码不起作用,很简单。没有时间可以发生事件。您创建一个订阅,它将仅识别您创建它的时刻中的事件,因为水印为空。只有一行之后,所以假设一毫秒后您问订阅“嘿,过去毫秒内是否有任何事件?” 答案是“不”。在程序启动时创建订阅并在计时器上调用 getevents,可能在 5 分钟后。如果您在过去五分钟内有任何事件,则会出现您的消息框。

于 2013-07-17T05:59:46.717 回答