在 Exchange 上使用 EWS 时关于邮箱事件的拉取通知

了解如何使用 EWS 托管 API 或 EWS 订阅拉取通知并获取事件。

Exchange 中的 EWS 使用拉取通知使客户端能够请求 (或拉取) 有关邮箱更改的通知。从服务器到客户端。

如果使用 EWS 托管 API 订阅拉取通知,请使用 SubscribeToPullNotifications 方法订阅并获取拉取通知。 然后,使用 GetEvents 方法从服务器获取事件。

若要使用 EWS 订阅拉取通知,请使用订阅操作创建订阅,分析响应,然后使用 GetEvents 操作获取通知

客户端收到有关在服务器上更改或创建的项的通知后,可以 同步更改

使用 EWS 托管 API 订阅并获取拉取通知

下面的代码示例演示如何使用 SubscribeToPullNotifications 方法订阅收件箱文件夹中所有事件的拉取通知。 然后,该示例使用 GetEvents 方法从服务器检索事件。 在此示例中,我们假定 服务 是有效的 ExchangeService 绑定。

// Subscribe to pull notifications in the Inbox.
PullSubscription subscription = service.SubscribeToPullNotifications( 
    new FolderId[] { WellKnownFolderName.Inbox }, 30, null, 
    EventType.NewMail, EventType.Created, EventType.Deleted,
    EventType.Modified, EventType.Moved, EventType.Copied, EventType.FreeBusyChanged); 
 
// Call GetEvents to retrieve events from the server. 
GetEventsResults events = subscription.GetEvents(); 

从服务器收到事件后,可以将 这些更改与服务器同步。 使用 如何实现取消订阅通知? 中指定的取消订阅方法之一,在不再需要订阅时,使用服务器结束订阅。

使用 EWS 订阅拉取通知

以下示例演示使用订阅操作发送到服务器以订阅收件箱文件夹中所有 EventType 的 XML 请求。 这也是 EWS 托管 API 在使用 SubscribeToPullNotifications 方法订阅拉取通知时发送的 XML 请求。

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2016" />
  </soap:Header>
  <soap:Body>
    <m:Subscribe>
      <m:PullSubscriptionRequest>
        <t:FolderIds xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
            <t:DistinguishedFolderId Id="inbox" />
        </t:FolderIds>
        <t:EventTypes>
          <t:EventType>CopiedEvent</t:EventType>
          <t:EventType>CreatedEvent</t:EventType>
          <t:EventType>DeletedEvent</t:EventType>
          <t:EventType>ModifiedEvent</t:EventType>
          <t:EventType>MovedEvent</t:EventType>
          <t:EventType>NewMailEvent</t:EventType>
        </t:EventTypes>
        <t:Timeout>5</t:Timeout>
      </m:PullSubscriptionRequest>
    </m:Subscribe>
  </soap:Body>
</soap:Envelope>

下面的 XML 示例显示从服务器发送到客户端以响应订阅操作请求的 SubscribeResponse 消息。 包含 ResponseCode 元素的 NoError 值意味着已成功创建订阅。 SubscriptionId 元素唯一标识服务器上的拉取通知订阅。 Watermark 元素表示邮箱事件队列中的书签。

<?xml version="1.0" encoding="utf-8"?>
<SubscribeResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ResponseMessages xmlns="http//schemas.microsoft.com/exchange/services/2006/messages">
    <SubscribeResponseMessage ResponseClass="Success">
      <ResponseCode>NoError</ResponseCode>
      <SubscriptionId>d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</SubscriptionId>
      <Watermark>AAAAAGUhAAAAAAAAAQ==</Watermark>
    </SubscribeResponseMessage>
  </ResponseMessages>
</SubscribeResponse>

创建订阅后,现在可以使用 SubscribeResponse 消息中返回的 SubscriptionId 获取事件。

使用 EWS 获取拉取通知

下面的 XML 示例显示了从客户端发送到服务器的 GetEvents 操作请求消息,以获取 SubscribeResponse 消息中返回的 SubscriptionId 的通知。 对于第一个 GetEvents 请求,请使用在订阅响应中返回的水印。 对于后续 GetEvents 请求,请使用上一个 GetEvents 请求中返回的最后一个水印

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2016" />
  </soap:Header>
  <soap:Body>
    <m:GetEvents>
      <m:SubscriptionId>d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</m:SubscriptionId>
      <m:Watermark>AAAAAGUhAAAAAAAAAQ==</m:Watermark>
    </m:GetEvents>
  </soap:Body>
</soap:Envelope>

以下 XML 示例显示从服务器发送到客户端的 GetEvents 响应消息。 每个 GetEvents 响应都包含有关一个或多个事件的信息。 为每个事件返回 水印 。 必须在下一个 GetEvents 请求中保存并使用最后一个水印。 如果自上次 GetEvents 请求以来未发生任何存储事件,则返回状态事件。

<?xml version="1.0" encoding="utf-8"?>
<GetEventsResponseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ResponseMessages xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
    <GetEventsResponseMessage ResponseClass="Success">
      <ResponseCode>NoError</ResponseCode>
      <Notification>
        <SubscriptionId xmlns="http://schemas.microsoft.com/exchange/services/2006/types">d581ab79-a2ec-4653-9c8e-564d7cfc1d8c</SubscriptionId>
        <PreviousWatermark xmlns="http://schemas.microsoft.com/exchange/services/2006/types">AAAAAGUhAAAAAAAAAQ==</PreviousWatermark>
        <MoreEvents xmlns="http://schemas.microsoft.com/exchange/services/2006/types">false</MoreEvents>
        <NewMailEvent xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
          <Watermark>AAAAAHMhAAAAAAAAAQ==</Watermark>
          <TimeStamp>2013-09-15T21:37:01Z</TimeStamp>
          <ItemId Id="AAAtA=" ChangeKey="CQAAAA==" />
          <ParentFolderId Id="AQAtAEFkbWA==" ChangeKey="AQAAAA==" />
        </NewMailEvent>
      </Notification>
    </GetEventsResponseMessage>
  </ResponseMessages>
</GetEventsResponse>

从服务器收到事件后, 将更改同步到客户端。 在不再需要订阅时,使用 “取消订阅”操作 结束服务器订阅。

后续步骤

收到通知后,可以 同步文件夹层次结构同步已更改的文件夹的内容

另请参阅