Поделиться через


Уведомления по запросу о событиях почтовых ящиков с помощью веб-служб Exchange в Exchange

Узнайте, как использовать управляемый API EWS или EWS для подписки на уведомления о вытягивании и получения событий.

EWS в Exchange использует уведомления о вытягивании, чтобы клиенты могли запрашивать (или вытягивать) уведомления об изменениях почтового ящика с сервера клиенту.

Если вы подписываетесь на уведомления о вытягивании с помощью управляемого API EWS, вы подписываетесь на уведомления о вытягивании и получаете их с помощью метода SubscribeToPullNotifications . Затем вы получаете события с сервера с помощью метода GetEvents .

Чтобы подписаться на уведомления о вытягивании с помощью EWS, создайте подписку с помощью операции Подписка, анализируете ответ, а затем получаете уведомления с помощью операции GetEvents.

После того как клиент получает уведомления об измененных или созданных на сервере элементах, он может синхронизировать изменения.

Подписка и получение уведомлений о вытягивании с помощью управляемого API EWS

В следующем примере кода показано, как использовать метод 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

В следующем примере показан XML-запрос для отправки на сервер для подписки на все EventTypes в папке "Входящие" с помощью операции Подписки. Это также XML-запрос, который управляемый API EWS отправляет при подписке на уведомления о вытягивании с помощью метода SubscribeToPullNotifications .

<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 , которое отправляется с сервера клиенту в ответ на запрос операции подписки . Включение значения NoError для элемента ResponseCode означает, что подписка создана успешно. Элемент 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 .

Получение уведомлений о вытягивании с помощью EWS

В следующем xml-примере показано сообщение запроса операции GetEvents , которое отправляется от клиента на сервер для получения уведомлений о Идентификаторе подписки , возвращенном в сообщении SubscribeResponse . Для первого запроса 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>

После получения события от сервера синхронизируйте изменения с клиентом. Используйте операцию Отмена подписки , чтобы завершить подписку на сервере, когда подписка больше не нужна.

Дальнейшие действия

После получения уведомлений можно синхронизировать иерархию папок или содержимое измененной папки.

См. также