Obter as alterações incrementais para as mensagens em uma pasta
A consulta delta permite consultar adições, exclusões ou atualizações de mensagens em uma pasta, por meio de uma série de chamadas de função delta. Os dados delta permitem manter e sincronizar um armazenamento local de mensagens do usuário, sem ter de buscar todo o conjunto de mensagens do usuário no servidor a cada vez que precise deles.
Sincronizar itens de mensagem em um repositório local pode usar a consulta delta para a sincronização completa inicial e sincronizações incrementais subsequentes. Normalmente, você faria uma sincronização total inicial de todas as mensagens em uma pasta (por exemplo, a caixa de entrada do usuário) e, em seguida, obteria alterações incrementais nessa pasta periodicamente.
Para obter alterações incrementais de apenas um determinado tipo - mensagens que são criadas, atualizadas ou excluídas desde a sincronização inicial - faça uma rodada inicial de sincronização de todas as mensagens na pasta e, em seguida, obtenha alterações incrementais de um tipo desejado específico nas rodadas subsequentes. Especifique o tipo de alteração desejado como uma opção de consulta na solicitação delta inicial; O Microsoft Graph codifica automaticamente todas as opções de consulta personalizada e OData @odata.nextLink no ou @odata.deltaLink fornecido na resposta.
Controlar mensagens de alterações em uma pasta
A consulta delta é uma operação por pasta. Para controlar as alterações das mensagens em uma hierarquia de pastas, você precisa controlar cada pasta individualmente.
O rastreamento de alterações de mensagem em uma paste de email corresponde a uma série de solicitações GET com a função delta. A solicitação GET inicial é muito semelhante à maneira como você obtém mensagens, exceto se você incluir a função delta:
GET https://graph.microsoft.com/v1.0/me/mailFolders/{id}/messages/delta
Uma solicitação GET com a função delta retorna:
- Uma
@odata.nextLink
(que contém uma URL com chamada de função delta e um skipToken) ou - Uma
@odata.deltaLink
(que contém uma URL com chamada de função delta e deltaToken).
Esses tokens são tokens de estado opacos para o cliente.
Para prosseguir com uma rodada de controle de alterações, copie e aplique a URL retornada da última solicitação GET para a próxima chamada de função delta para a mesma pasta. Um @odata.deltaLink
retornado em uma resposta significa que a fase atual do rastreamento de alterações está concluída. Você pode salvar e usar a URL @odata.deltaLink
quando começar a próxima fase.
O restante deste artigo inclui dois exemplos:
- Confira o exemplo 1 para saber como usar as
@odata.nextLink
URLs e@odata.deltaLink
. - Confira o exemplo 2 para saber como obter somente mensagens criadas incrementalmente desde a rodada inicial.
Use os parâmetros de consulta em uma consulta delta para mensagens
- Você pode usar um parâmetro de consulta
$select
como em qualquer solicitação GET para especificar somente as propriedades necessárias para obter melhor desempenho. Aid
propriedade sempre é retornada. - Suporte à consulta delta
$select
,$top
e$expand
para mensagens. - Há suporte limitado para
$filter
e$orderby
:- As únicas expressões
$filter
com suporte são$filter=receivedDateTime+ge+{value}
ou$filter=receivedDateTime+gt+{value}
. - A aplicação de
$filter
em uma consulta Delta retorna apenas até 5.000 mensagens. - A única expressão
$orderby
suportada é$orderby=receivedDateTime+desc
. Se você não incluir uma expressão$orderby
, a ordem de retorno não será garantida.
- As únicas expressões
- Não há suporte para
$search
.
Além disso, para retornar apenas determinado tipo de alterações (criadas, atualizadas ou excluídas) na resposta da consulta delta, você pode, opcionalmente, filtrar o tipo de alteração desejado usando uma opção changeType
de consulta personalizada . Os valores possíveis são created
, updated
ou deleted
.
GET /me/mailfolders/{id}/messages/delta?changeType=created
GET /me/mailfolders/{id}/messages/delta?changeType=updated
GET /me/mailfolders/{id}/messages/delta?changeType=deleted
Cabeçalhos de solicitação opcionais
Cada solicitação GET de consulta delta retorna um conjunto de um ou mais mensagens na resposta. Como alternativa, você pode especificar o cabeçalho de solicitação, Prefer: odata.maxpagesize={x}
, para configurar o máximo de mensagens em uma resposta.
Exemplo 1: sincronizar mensagens em uma pasta
O exemplo a seguir mostra 2 sessões de sincronização de uma pasta específica que, inicialmente, contém 5 mensagens.
A primeira sessão envolve uma série de 3 solicitações para sincronizar todas as 5 mensagens na pasta:
- Solicitação inicial de exemplo e resposta
- Solicitação de segundo exemplo e resposta
- Terceiro exemplo de solicitação e resposta final
Após a primeira sessão, uma das mensagens é excluída e outra é marcada como lida. A segunda sessão da sincronização retorna apenas o intervalo (a exclusão e atualização) sem retornar as demais mensagens que permaneceram as mesmas.
Solicitação inicial de exemplo
Neste exemplo, a pasta especificada está sendo sincronizada pela primeira vez, portanto, a solicitação de sincronização inicial não inclui nenhum token de estado. Essa rodada retorna todas as mensagens nessa pasta.
A primeira solicitação especifica o seguinte:
- Um parâmetro
$select
para retornar as propriedadessubject
,sender
eisRead
de cada mensagem na resposta. - O cabeçalho de solicitação opcional, odata.maxpagesize, retornando 2 mensagens de cada vez.
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$select=subject,sender,isRead HTTP/1.1
Prefer: odata.maxpagesize=2
Resposta inicial de exemplo
A resposta inclui duas mensagens e um cabeçalho de resposta @odata.nextLink
.
A URL @odata.nextLink
indica que há mais mensagens na pasta para obter.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.nextLink": "https://graph.microsoft.com/v1.0/me/mailfolders('AQMkADNkNAAAgEMAAAA')/messages/delta?$skiptoken=GwcBoTmPuoTQWfcsAbkYM",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzPFjSbaPPxzjlzOTAAASsKZz\"",
"subject": "Holiday hours update",
"isRead": false,
"sender": {
"emailAddress": {
"name": "Dana Swope",
"address": "danas@contoso.com"
}
},
"id": "AAMkADNkNAAASq35xAAA="
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzPFjSbaPPxzjlzOTAAAEfYB/\"",
"subject": "Holiday promotion sale",
"isRead": true,
"sender": {
"emailAddress": {
"name": "Samantha Booth",
"address": "samanthab@contoso.com"
}
},
"id": "AQMkADNkNAAAVRMKAAAAA=="
}
]
}
Segundo exemplo de solicitação
A segunda solicitação especifica a URL @odata.nextLink
retornada na resposta anterior. Observe que não é mais necessário especificar o mesmo parâmetro $select
como na solicitação inicial, pois o skipToken
na URL @odata.nextLink
os codifica e inclui.
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$skiptoken=GwcBoTmPuoTQWfcsAbkYM HTTP/1.1
Prefer: odata.maxpagesize=2
Segunda resposta de exemplo
A segunda resposta retorna as 2 próximas mensagens na pasta e outro @odata.nextLink
, indicando que há mais mensagens a ser lidas na pasta.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.nextLink": "https://graph.microsoft.com/v1.0/me/mailfolders('AQMkADNkNAAAgEMAAAA')/messages/delta?$skiptoken=GwcBoTmPKILK4jLH7mAd1lLU",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzPFjSbaPPxzjlqfdAAAEfYB+\"",
"subject": "Microsoft Virtual Academy at Contoso",
"isRead": true,
"sender": {
"emailAddress": {
"name": "Elliot Hyde",
"address": "elliot-hyde@tailspintoys.com"
}
},
"id": "AQMkADNkNAAAgWkAAAA"
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzPFjSbaPPxzjlzOTAAAEfYB+\"",
"subject": "New or modified user account information",
"isRead": true,
"sender": {
"emailAddress": {
"name": "Randi Welch",
"address": "randiw@contoso.com"
}
},
"id": "AQMkADNkNAAAgWJAAAA"
}
]
}
Terceira solicitação de exemplo
A terceira solicitação continua a usar a última URL do @odata.nextLink
retornada da última solicitação de sincronização.
GET https://graph.microsoft.com/v1.0/me/mailFolders/AQMkADNkNAAAgEMAAAA/messages/delta?$skiptoken=GwcBoTmPKILK4jLH7mAd1lLU HTTP/1.1
Prefer: odata.maxpagesize=2
Terceira e última resposta de exemplo
A terceira resposta retorna a única mensagem restante na pasta e uma @odata.deltaLink
URL que indica que a sincronização está concluída por enquanto para esta pasta. Salvar e usar a URL @odata.deltaLink
para sincronizar a mesma pasta na próxima fase.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.deltaLink": "https://graph.microsoft.com/v1.0/me/mailfolders('AQMkADNkNAAAgEMAAAA')/messages/delta?$deltatoken=GwcBoTmPuoGNlgXgF1nyUNMXY",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzFPjSbaPPxzjlzOTAAAEfYB+\"",
"subject": "Fabric CDN now available",
"isRead": true,
"sender": {
"emailAddress": {
"name": "Jodie Sharp",
"address": "Jodie.Sharp@contoso.com"
}
},
"id": "AAMkADk0MGFkODE3LWEAAA="
}
]
}
Sincronizar mensagens na mesma pasta na próxima sessão
Usando a @odata.deltaLink
da última solicitação na última rodada, você é capaz de obter apenas as mensagens que foram alteradas (sendo adicionadas, excluídas ou atualizadas) nessa pasta desde então.
Sua primeira solicitação na próxima fase terá aparência semelhante à seguinte, supondo que você prefira manter o mesmo tamanho máximo de página na resposta:
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$deltatoken=GwcBoTmPuoGNlgXgF1nyUNMXY HTTP/1.1
Prefer: odata.maxpagesize=2
A resposta contém um @odata.deltaLink
. Isso indica que todas as alterações na pasta de email remoto agora estão sincronizadas. Uma mensagem foi excluída e a mensagem foi alterada.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.deltaLink": "https://graph.microsoft.com/v1.0/me/mailfolders('AQMkADNkNAAAgEMAAAA')/messages/delta?$deltatoken=GwcBoTmPuoGNlgXgF1nyUNMXY",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"id": "AAMkADk0MGFkODE3LWE4MmYtNDRhOS0Dh_6qB-pB2Sa2pUum19a6YAAKnLuxoAAA=",
"@removed": {
"reason": "deleted"
}
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAAARn2vdzPFjSbaPPxzjlzOTAAASsKZz\"",
"subject": "Holiday hours update",
"isRead": "true",
"sender": {
"emailAddress": {
"name": "Dana Swope",
"address": "danas@contoso.com"
}
},
"id": "AAMkADNkNAAASq35xAAA="
}
]
}
Exemplo 2: sincronizar mensagens em uma pasta com base no tipo de alteração
O exemplo a seguir mostra a obtenção apenas de mensagens que são criadas em uma pasta específica desde a sincronização inicial. O exemplo envolve duas rodadas de sincronização dessa pasta que inicialmente contém 4 mensagens.
A primeira rodada envolve uma série de duas solicitações para sincronizar todas as 4 mensagens na pasta:
- Solicitação inicial de exemplo com o tipo de alteração e a resposta especificados
- Exemplo de segunda solicitação com o tipo de alteração e a resposta especificados
Após a primeira rodada, mais duas mensagens são criadas, uma mensagem é excluída e outra é marcada como leitura.
A segunda rodada de sincronização retorna apenas as alterações na pasta do tipo de created
alteração (as duas novas mensagens criadas), sem retornar as outras mensagens que permaneceram as mesmas, excluídas ou atualizadas desde a última sincronização.
Solicitação inicial de exemplo com o tipo de alteração especificado
Neste exemplo, a pasta especificada está sendo sincronizada pela primeira vez, portanto, a solicitação de sincronização inicial não inclui nenhum token de estado. Essa rodada retorna todas as mensagens nessa pasta.
A primeira solicitação especifica o seguinte:
- Um
changeType
parâmetro para retornar apenas as mensagens criadas na resposta delta subsequente. - Um parâmetro
$select
para retornar as propriedadessubject
,sender
eisRead
de cada mensagem na resposta. - O cabeçalho de solicitação opcional, odata.maxpagesize, retornando 2 mensagens de cada vez.
GET https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?changeType=created&$select=subject,sender,isRead HTTP/1.1
Prefer: odata.maxpagesize=2
Exemplo de resposta inicial com o tipo de alteração especificado
A resposta inclui duas mensagens e um cabeçalho de resposta @odata.nextLink
.
A URL @odata.nextLink
indica que há mais mensagens na pasta para obter.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.nextLink": "https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$skiptoken=P4lmXpjPRrjB6haAQzSkpK89jYTVD2kVtOeXNRnfYzPbCs",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MBP\"",
"subject": "Inline Attachments Again",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LT2fKdhq8oSKEDSVrdi3lRAAIei5gdAAA=",
"sender": {
"emailAddress": {
"name": "Megan Brown",
"address": "Megan.Brown@contoso.com"
}
}
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MBR\"",
"subject": "RE: Test Outlook TimeZone",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LTMKdhq8oSKEDSVrdi3lRAAIei5geAAA=",
"sender": {
"emailAddress": {
"name": "Megan Brown",
"address": "Megan.Brown@contoso.com"
}
}
}
]
}
Exemplo de segunda solicitação com o tipo de alteração especificado
A segunda solicitação especifica a URL @odata.nextLink
retornada na resposta anterior. Observe que ele não precisa mais especificar o mesmo $select
ou o changeType
parâmetro que na solicitação inicial, como o skipToken
na URL codifica e o @odata.nextLink
inclui.
GET https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$skiptoken=P4lmXpjPRrjB6haAQzSkpK89jYTVD2kVtOeXNRnfYzPbCs HTTP/1.1
Prefer: odata.maxpagesize=2
Exemplo de segunda resposta com o tipo de alteração especificado
A segunda resposta retorna as próximas duas mensagens na pasta e @odata.deltaLink
na URL que indica que a sincronização está concluída por enquanto para esta pasta. Salvar e usar a URL @odata.deltaLink
para sincronizar a mesma pasta na próxima fase.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.deltaLink": "https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$deltatoken=P4lmXpjPRrjB6haAQ_37roqIbjXe66KoV7SMlLH--Jgi8",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MBu\"",
"subject": "Your preview of the new Briefing email",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LTMzNjMwNWM0ZGE2YQBGAAAAAADbrwBIJ",
"sender": {
"emailAddress": {
"name": "Cortana",
"address": "cortana@contoso.com"
}
}
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MBw\"",
"subject": "Char Coding HTML",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LTMzNjMwNWM0ZGE2YQBGAAAAAADbrwBA=",
"sender": {
"emailAddress": {
"name": "John Doe",
"address": "John.Doe@contoso.com"
}
}
}
]
}
Sincronizar mensagens na mesma pasta na próxima rodada com base no tipo de alteração especificado
Usando a @odata.deltaLink
da última resposta na última rodada, você é capaz de obter apenas as mensagens que foram adicionadas nessa pasta desde então.
Sua primeira solicitação na próxima fase terá aparência semelhante à seguinte, supondo que você prefira manter o mesmo tamanho máximo de página na resposta:
GET https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$deltatoken=P4lmXpjPRrjB6haAQ_37roqIbjXe66KoV7SMlLH--Jgi8 HTTP/1.1
Prefer: odata.maxpagesize=2
A resposta contém um @odata.deltaLink
. Isso indica que todas as alterações na pasta de email remoto agora estão sincronizadas. Duas mensagens foram adicionadas desde a última sincronização. As mensagens atualizadas & excluídas desde a última sincronização não são retornadas nesta resposta delta.
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(message)",
"@odata.deltaLink": "https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$skiptoken=EPuhZPRDHo-r3EBfscYE444fuGSBRV1eXex3JZkLzT9fRM",
"value": [
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MCP\"",
"subject": "Nested Attachment",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LTMzNjMwNWM0ZGE2YQBGAAAAAADbrwBIJ",
"sender": {
"emailAddress": {
"name": "Patti Fernandez",
"address": "PattiF@contoso.com"
}
}
},
{
"@odata.type": "#microsoft.graph.message",
"@odata.etag": "W/\"CQAAABYAAACQ2fKdhq8oSKEDSVrdi3lRAAId0MCN\"",
"subject": "Attachment Testing",
"isRead": true,
"id": "AAMkAGUwNjQ4ZjIxLTQ3Y2YtNDViMi1iZjc4LTMzNjMwNWM0ZGE2YQBGAAAAAADbrwZA=",
"sender": {
"emailAddress": {
"name": "Patti Fernandez",
"address": "PattiF@contoso.com"
}
}
}
]
}