Skip to main content
 首页 » 编程设计

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

2024年02月13日31myhome

我正在使用 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() 上放置一个断点,然后移动一封电子邮件,这会很好地工作。但是没有断点它就不起作用。 事件 不包含任何结果。

有什么想法吗?

请您参考如下方法:

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

要使您的代码正常工作,您应该做两件事。 首先:在启动应用程序时创建订阅并保留对它的引用。 在 Second Store 中,您从订阅中获取水印,并在应用程序启动时重新加载它。可能是这样的:

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