繁体   English   中英

使用Exchange Web服务托管API检测电子邮件移动?

[英]Detect email move using Exchange Web Service Managed API?

我正在使用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包含任何结果。

有任何想法吗 ?

你正确的方式,但你错过了什么。 您的代码只会获取创建订阅和获取事件之间发生的事件,这就是它只适用于断点的原因。

为了使你的代码工作,你应该做两件事。 首先:在启动应用程序时创建子程序并继续参考它。 在Second Store中,您从Subscription获得的Watermark会在应用程序启动时重新加载。 也许是这样的:

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 ,用于标识项目从中移动到的文件夹。

你的代码无法工作的原因很简单。 事件没有时间发生。 您创建一个只会识别您创建它的Moment事件的子目录,因为水印为空。 之后只有一行,所以让我们说一个毫秒之后你会问这个订阅“嘿,过去几毫秒有没有活动?” 答案是“不”。 在程序启动时创建订阅并在计时器上调用getevents,可能是5分钟后。 如果您在过去五分钟内有任何活动,则会显示您的消息框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM