2013-06-19 2 views
1

EWS Managed API 및 C#을 사용하고 있습니다.Exchange Web Service Managed 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

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를 사용하고있다. 너와 모든 것이 잘 작동한다. 귀하가 관찰하는 편지함의 모든 폴더 목록을 가져와야합니다. 그리고 그것은 잘 작동합니다. 귀하의 코드는 다음과 같이 보일 것입니다 : List folders = GetAllFolderIds(); subscription = service.SubscribeToPullNotifications (폴더, 1440, 워터 마크, EventType.Moved); GetEventsResults currentevents = Subscription.GetEvents(); GetEvents()를 호출 할 때 메일이 가입 기간 사이에 이동하면 이동이 포함됩니다. –

+0

@ JürgenHoffmann : OP가 올바른 대답으로 표시 할 수 있도록 답변으로 의견을 추가해야한다고 생각합니다. –

3

올바른 방법으로 귀하의 누락 된 항목을 찾으십시오. 귀하의 코드는 구독 만들기와 이벤트 가져 오기 사이에 발생하는 이벤트 만 가져 오므로 중단 점에서만 작동합니다.

코드를 작동 시키려면 2 가지 작업을 수행해야합니다. 처음에 : 응용 프로그램을 시작할 때 참조를 유지하면서 구독을 만듭니다. 두 번째 저장소에서 구독에서 가져온 워터 마크를 저장하고 응용 프로그램을 시작할 때 다시로드하십시오. 어쩌면 이런 식으로 :

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

코드가 작동하지 않는 이유는 간단합니다. 이벤트가 발생할 수있는 시간이 없습니다. 당신은 그것을 만드는 순간의 이벤트만을 인식 할 서브 스크립 션을 생성합니다. 왜냐하면 워터 마크가 null이기 때문입니다. 나중에 한 줄만 입력 했으므로 한 밀리 초 후에 구독을 물어 봅시다. "지난 1 밀리 초 내에 어떤 이벤트가 있었습니까?" 대답은 "아니오"입니다. 프로그램 시작시 구독을 만들고 5 분 후에 타이머로 getevents를 호출하십시오. 지난 5 분 동안 어떤 이벤트가 있었다면 메시지 상자가 나타납니다.