簡體   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