我正在使用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
不包含任何结果。
有什么想法吗?
答案 0 :(得分:3)
你正确的方式,但你错过了什么。您的代码只会获取创建订阅和获取事件之间发生的事件,这就是它只适用于断点的原因。
要使代码正常工作,您应该做两件事。 首先:在启动应用程序时创建子程序并继续参考它。 在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;
}
}
}
答案 1 :(得分:1)
您可以将流式通知与EWS一起使用来侦听Exchange Server上项目的更改。以下是有关如何设置流式通知的示例:
在您的情况下,您应该处理EventType.Moved
事件。当您处理事件时,您将获得一个ItemEvent
类型的对象(如上例所示),该对象具有两个属性OldParentFolderId
和ParentFolderId
,用于标识项目从中移出的文件夹和。
答案 2 :(得分:0)
为什么你的代码不起作用的原因很简单。事件没有时间发生。您创建一个只会识别您创建它的Moment事件的子目录,因为水印为空。之后只有一行,所以让我们说一个毫秒之后你会问这个订阅“嘿,过去几毫秒有没有活动?”答案是“不”。在程序启动时创建订阅并在计时器上调用getevents,可能是5分钟后。如果您在过去五分钟内有任何活动,则会显示您的消息框。