Efetuar pull de notificações sobre eventos de caixa de correio usando o EWS no Exchange

Descubra como usar a API Gerenciada do EWS ou o EWS para assinar notificações por pull e obter eventos.

O EWS no Exchange usa notificações por pull para permitir que os clientes solicitem (ou puxem) notificações sobre alterações na caixa de correio do servidor para o cliente.

Se você estiver assinando notificações por pull usando a API Gerenciada do EWS, assine e obtenha notificações por pull usando o método SubscribeToPullNotifications . Em seguida, você obtém eventos do servidor usando o método GetEvents .

Para assinar notificações por pull usando o EWS, crie uma assinatura usando a operação Assinar, analise a resposta e obtenha as notificações usando a operação GetEvents.

Depois que o cliente receber notificações de itens que são alterados ou criados no servidor, ele poderá sincronizar as alterações.

Assinar e obter notificações por pull usando a API Gerenciada do EWS

O exemplo de código a seguir mostra como usar o método SubscribeToPullNotifications para assinar notificações pull para todos os eventos na pasta Caixa de Entrada. Em seguida, o exemplo usa o método GetEvents para recuperar eventos do servidor. Neste exemplo, supomos que o serviço seja uma associação válida do 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(); 

Depois de receber um evento do servidor, você pode sincronizar essas alterações com o servidor. Usar um dos métodos de cancelamento de assinatura especificados em Como fazer cancelar a assinatura de notificações? para encerrar a assinatura com o servidor quando a assinatura não for mais necessária.

Assinar notificações por pull usando o EWS

O exemplo a seguir mostra a solicitação XML para enviar ao servidor para assinar todos os EventTypes na pasta Caixa de Entrada usando a operação Assinar. Essa também é a solicitação XML que a API Gerenciada do EWS envia ao assinar notificações pull usando o método 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>

O exemplo XML a seguir mostra a mensagem SubscribeResponse enviada do servidor para o cliente em resposta à solicitação de operação Assinar . A inclusão do valor NoError para o elemento ResponseCode significa que a assinatura foi criada com êxito. O elemento SubscriptionId identifica exclusivamente a assinatura de notificação pull no servidor. O elemento Watermark representa um indicador na fila de eventos da caixa de correio.

<?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>

Depois de criar a assinatura, agora você pode obter eventos usando o SubscriptionId retornado na mensagem SubscribeResponse .

Obter notificações por pull usando o EWS

O exemplo XML a seguir mostra a mensagem de solicitação de operação GetEvents enviada do cliente para o servidor para obter notificações para o SubscriptionId que é retornado na mensagem SubscribeResponse . Para a primeira solicitação GetEvents , use a Marca d'água retornada na resposta Assinar . Para solicitações getEvents subsequentes , use a última marca d'água que foi retornada na solicitação getEvents anterior.

<?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>

O exemplo XML a seguir mostra a mensagem de resposta GetEvents enviada do servidor para o cliente. Cada resposta getEvents inclui informações sobre um ou mais eventos. Uma marca d'água é retornada para cada evento. A última marca d'água deve ser salva e usada na próxima solicitação GetEvents . Se nenhum evento de repositório tiver ocorrido desde a última solicitação GetEvents , um evento de status será retornado.

<?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>

Depois de receber um evento do servidor, sincronize as alterações no cliente. Use a operação Cancelar assinatura para encerrar a assinatura com o servidor quando a assinatura não for mais necessária.

Próximas etapas

Depois de receber notificações, você pode sincronizar a hierarquia de pastas ou sincronizar o conteúdo da pasta alterada.

Confira também