使用Exchange Web Service Managed API检测电子邮件移动

本文关键字:检测 电子邮件 移动 API Managed Exchange Web Service 使用 | 更新日期: 2023-09-27 18:18:56

我使用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没有结果

有什么想法吗?

使用Exchange Web Service Managed API检测电子邮件移动

你的方向是对的,但是你缺少了一些东西。您的代码将只获取在创建订阅和获取事件之间发生的事件,这就是为什么它只与断点一起工作。

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

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;
        }
    }
}

您可以在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,它们标识了项目被移动的文件夹。

你的代码不工作的原因很简单。没有时间让事件发生。你创建一个订阅,它将只识别事件从你创建它的时刻,因为水印是空的。仅一行之后,假设一毫秒之后,您询问订阅"嘿,在过去一毫秒中有任何事件吗?"答案是"没有"。在程序启动时创建订阅,并在计时器上调用geteevents,也许是5分钟后。如果你在过去五分钟内发生了什么事件,你的消息框就会出现