2013-06-19 88 views
1

我正在使用EWS託管API和C#。使用Exchange Web服務託管API檢測電子郵件移動?

我想知道是否有可能檢測到電子郵件何時移動到另一個文件夾。

這是我到目前爲止有:

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不包含結果。

任何想法?

回答

1

您可以使用Streaming Notifications和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兩個屬性,它們標識項目從中移動到的文件夾。

+0

感謝您的回答。 不幸的是我工作的Exchange服務2010不是SP1 我試過類似這樣的東西,但與'PullSubscription',但當我嘗試'GetEvents()'我什麼也沒有 –

+0

@StephaneBintein:我使用PullSubscriptions你和一切工作正常。您必須獲取您觀察的郵箱中的所有文件夾列表。而且,它工作正常。你的代碼應該看起來像這樣:列表 folders = GetAllFolderIds(); subscription = service.SubscribeToPullNotifications(文件夾,1440,水印,EventType.Moved); GetEventsResults currentevents = Subscription.GetEvents();如果郵件在訂閱和調用GetEvents()之間移動,則包含該移動。 –

+0

@JürgenHoffmann:我認爲你應該添加你的評論作爲答案,以便OP可以將其標記爲正確的答案。 –

3

你在正確的方式,但你失去了一些東西。您的代碼只會獲得創建訂閱和獲取事件之間發生的事件,這就是爲什麼它僅適用於斷點。

爲了使你的代碼工作,你應該做2件事。 起初:當你啓動你的應用程序並保留一個引用時創建subscrption。 在第二存儲從訂閱中獲得的水印並在應用程序啓動時重新加載它。也許是這樣的:

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; 

     } 
    } 
} 
0

原因,爲什麼你的代碼不工作,只是簡單的。沒有時間可以發生事件。你創建了一個只能識別你創建它的瞬間的事件,因爲水印是空的。只有一行後,所以讓我們說,毫秒後,你問訂閱「嘿,有沒有在過去幾毫秒的事件?」答案是「否」。也許5分鐘後,在程序啓動時創建您的訂閱並在計時器上調用getevents。如果您在過去五分鐘內發生過任何事件,則會顯示您的訊息框。

相關問題