0

我正在編寫一個同步工具,它將發送所有收到和發送的電子郵件到我們在CakePHP中構建的PHP應用程序。爲此,我正在使用Streaming NotificationsOutlook365 EWS流媒體通知|新用戶第一事件

現在,對於我想要聽的每個smtp地址,我正在創建一個新服務,它將在「收件箱」和「SentItems」文件夾中偵聽「已創建」事件。我通過一個有權模擬所有這些帳戶的帳戶來執行此操作。

的文件夾和事件我談論(C#)

// The folders we want to listen to 
FolderId[] folderIds = new FolderId[] { 
    WellKnownFolderName.Inbox, 
    WellKnownFolderName.SentItems 
}; 
// The event types we want to listen to 
EventType[] eventTypes = new EventType[] { 
    EventType.Created 
}; 

此外,我們使用Outlook365可以通過https://portal.outlook365.com訪問,我可以再登錄。當我在「Outlook365」中創建新用戶時,我可以登錄到新創建的帳戶。

但是,這是我的問題出現的地方。當我啓動該工具並將我的SubscriptionStreamConnection打開到該smtp地址時,它立即觸發類型爲ItemEvent的事件。所以,我假設這是一個有效的事件,就像收件箱和sentitems文件夾中新創建的電子郵件一樣。但是這個第一個事件並不包含我所要求的所有數據,只發生一次!我第二次聽到這個帳戶的事件沒有被觸發,所以我認爲這是某種「創建收件箱」事件,但我不確定我如何區分這種情況與正常事件。

我所要求的(C#)

PropertySet propSet = new PropertySet(
    BasePropertySet.IdOnly, 
    EmailMessageSchema.InternetMessageId, 
    // Basic data 
    EmailMessageSchema.Subject, 
    EmailMessageSchema.UniqueBody, 
    EmailMessageSchema.ConversationId, 
    EmailMessageSchema.DateTimeReceived, 
    EmailMessageSchema.DateTimeSent, 
    // Sender and recipient data 
    EmailMessageSchema.From, 
    EmailMessageSchema.ToRecipients, 
    EmailMessageSchema.CcRecipients, 
    EmailMessageSchema.BccRecipients 
    ); 

什麼我收到(XML)

<?xml version="1.0" encoding="utf-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
     <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="939" MinorBuildNumber="16" Version="V2_11" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
      <m:GetItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items> 
       <t:Message> 
       <t:ItemId Id="AA/BB/CC/DD=" ChangeKey="AA/BB" /> 
       <t:DateTimeReceived>2014-05-13T09:47:44Z</t:DateTimeReceived> 
       <t:DateTimeSent>2014-05-13T09:47:44Z</t:DateTimeSent> 
       <t:ConversationId Id="AA=" /> 
       <t:InternetMessageId><[email protected]></t:InternetMessageId> 
       </t:Message> 
      </m:Items> 
      </m:GetItemResponseMessage> 
     </m:ResponseMessages> 
     </m:GetItemResponse> 
    </s:Body> 
    </s:Envelope> 

請注意:我改變了ID對可讀性的原因,我保留/到位,以防萬一他們的意思是

正如你可以看到XML響應不包含我的全部要求,但是正常情況下(當我發送郵件到該新帳戶)我確實收到完整的響應特性,如:

<?xml version="1.0" encoding="utf-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
     <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="939" MinorBuildNumber="16" Version="V2_11" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
      <m:GetItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items> 
       <t:Message> 
       <t:ItemId Id="AA/BB/CC/DE=" ChangeKey="AA/BB" /> 
       <t:Subject>My random test!</t:Subject> 
       <t:DateTimeReceived>2014-05-13T10:25:55Z</t:DateTimeReceived> 
       <t:DateTimeSent>2014-05-13T10:25:38Z</t:DateTimeSent> 
       <t:ConversationId Id="AA/LEGY=" /> 
       <t:UniqueBody BodyType="Text" IsTruncated="false">Hello World</t:UniqueBody> 
       <t:ToRecipients> 
        <t:Mailbox> 
        <t:Name>a10 Test</t:Name> 
        <t:EmailAddress>[email protected]</t:EmailAddress> 
        <t:RoutingType>SMTP</t:RoutingType> 
        <t:MailboxType>Mailbox</t:MailboxType> 
        </t:Mailbox> 
       </t:ToRecipients> 
       <t:From> 
        <t:Mailbox> 
        <t:Name>My Name - Company</t:Name> 
        <t:EmailAddress>[email protected]</t:EmailAddress> 
        <t:RoutingType>SMTP</t:RoutingType> 
        <t:MailboxType>OneOff</t:MailboxType> 
        </t:Mailbox> 
       </t:From> 
       <t:InternetMessageId><[email protected]></t:InternetMessageId> 
       </t:Message> 
      </m:Items> 
      </m:GetItemResponseMessage> 
     </m:ResponseMessages> 
     </m:GetItemResponse> 
    </s:Body> 
    </s:Envelope> 

當然,我可以添加一個簡單的檢查,例如主題是否存在於這個事件中,但這看起來並不正確。

只是爲了澄清,我的一些項目「屬性」如下:

  • 我連接outlook365.com
  • 我正在使用C#與.NET4。5架構和最新的EWS API
  • 我有一個能扮演所有其他用戶,使程序並不需要知道所有的密碼
  • 我添加的所有ImpersonatedUserId的我要聽,每個那些冒充的一個用戶用戶有他們自己的服務(我認爲這個信息已經過時了,但它可能對你有幫助)
  • 在我的「OnNotificationEvent」中,我嘗試通過它的ID獲取項目(在一個新線程中,以便主程序可以繼續)

這是該方法的處理該事件的代碼:

protected void _OnExchangeNotificationEvent(object sender, NotificationEventArgs args) 
{ 
    StreamingSubscriptionConnection connection = (StreamingSubscriptionConnection)sender; 
    StreamingSubscription subscription = args.Subscription; 

    // Loop through all item-related events. 
    foreach (NotificationEvent notification in args.Events) 
    { 
     // if the notification is NOT an item event, skip the event 
     if (!(notification is ItemEvent)) 
     { 
      continue; 
     } 

     // Start a new thread so the main program can continue 
     Thread exchangeToCrmThread = new Thread(() => this._handleExchangeEventToCrm((ItemEvent)notification, args)); 
     exchangeToCrmThread.Start(); 
    } 
} 

注意_handleExchangeEventToCrm方法,該方法實際上試圖獲取EmailMessage(按照上面的PropertySet)。

我的問題

只是爲了澄清

爲什麼一個新的用戶觸發ItemEvent當我通過StreamingSubscribtion聽着它的第一次?換句話說,我怎樣才能區分「正常」的電子郵件發送/接收事件和其他顯然是「ItemEvent」的事件呢?

我懷疑它與「郵箱創建」有關,但我不確定。任何幫助是極大的讚賞!

如果有不清楚的地方,請你讓我澄清我的問題

回答

1

我只是repro'd這個,我發現自己在一個新的郵箱收到的第一個項目是一個文件夾關聯項目(FAI) 。因此,OWA/Outlook中的收件箱中沒有任何內容出現,但我收到了收件箱中的CreatedEvent通知。您可以通過檢查IsAssociated元素來確定它是與文件夾關聯的項目。如果IsAssociated爲真,那不是正常的消息。

+0

謝謝你爲此付出的努力來檢查它!如果它確實爲我解決了問題,我會放棄它並將其標記爲答案。儘管我們現在處於Office365用戶的限制範圍內,但我現在還不能說出來。所以我可能需要一段時間才能確定它的標記。 +1雖然你! – Jelmer