Obtener los cambios incrementales en los mensajes de una carpeta
La consulta delta permite consultar las adiciones, eliminaciones o actualizaciones de los mensajes en una carpeta, por medio de una serie de llamadas a función delta. Los datos de delta permiten mantener y sincronizar un almacén local de mensajes de un usuario, sin tener que capturar todo el conjunto de mensajes del usuario desde el servidor cada vez.
La sincronización de elementos de mensaje en un almacén local puede usar la consulta delta para la sincronización completa inicial y las sincronizaciones incrementales posteriores. Normalmente, realizaría una sincronización completa inicial de todos los mensajes de una carpeta (por ejemplo, la Bandeja de entrada del usuario) y, a continuación, obtendría los cambios incrementales en esa carpeta periódicamente.
Para obtener cambios incrementales de solo un tipo determinado (mensajes que se crean, actualizan o eliminan desde la sincronización inicial) realicen una ronda inicial de sincronización de todos los mensajes de la carpeta y, a continuación, obtengan cambios incrementales de un tipo deseado específico en rondas posteriores. Especifique el tipo de cambio deseado como una opción de consulta en la solicitud delta inicial; Microsoft Graph codifica automáticamente las opciones OData y de consulta personalizada en o @odata.nextLink@odata.deltaLink proporcionadas en la respuesta.
Seguimiento de cambios de mensajes en una carpeta
La consulta de delta es una operación por carpeta. Para realizar el seguimiento de los cambios de los mensajes en una jerarquía de carpetas, debe realizar un seguimiento de cada carpeta de forma individual.
El seguimiento de los cambios de mensajes en una carpeta de correo normalmente es una ronda de una o varias solicitudes GET con la función delta. La solicitud GET inicial es muy similar a la forma de obtener mensajes, salvo que se incluye la función delta:
GET https://graph.microsoft.com/v1.0/me/mailFolders/{id}/messages/delta
Una solicitud GET con la función delta función devuelve:
- Un
@odata.nextLink
(que contiene una dirección URL con una llamada de función delta y un skipToken), o - Un
@odata.deltaLink
(que contiene una dirección URL con una llamada de función delta y un deltaToken).
Estos tokens son tokens de estado que son opacos para el cliente.
Para continuar con una ronda de seguimiento de cambios, copie y aplique la dirección URL devuelta desde la última solicitud GET a la siguiente llamada de función delta para la misma carpeta. Un @odata.deltaLink
devuelto en una respuesta significa que la ronda actual de seguimiento de cambios está completa. Se puede guardar y usar la dirección URL @odata.deltaLink
cuando se inicia la siguiente ronda.
El resto de este artículo incluye 2 ejemplos:
- Consulte el ejemplo 1 para obtener información sobre cómo usar las
@odata.nextLink
direcciones URL y@odata.deltaLink
. - Vea el ejemplo 2 para obtener información sobre cómo obtener incrementalmente solo los mensajes creados desde la ronda inicial.
Usar parámetros de consulta en una consulta de delta para los mensajes
- Puede utilizar un parámetro de consulta
$select
como en cualquier solicitud GET para especificar solo las propiedades que necesita para un mejor rendimiento. Laid
propiedad siempre se devuelve. - Compatibilidad con consultas de delta
$select
,$top
, y$expand
para los mensajes. - Hay compatibilidad limitada para
$filter
y$orderby
:- Las únicas expresiones
$filter
admitidas son$filter=receivedDateTime+ge+{value}
y$filter=receivedDateTime+gt+{value}
. - La aplicación de
$filter
en una consulta delta solo devuelve un máximo de 5 000 mensajes. - La única expresión
$orderby
admitida es$orderby=receivedDateTime+desc
. Si no incluye una$orderby
expresión, no se garantiza el orden de devolución.
- Las únicas expresiones
- No hay compatibilidad con
$search
.
Además, para devolver solo cierto tipo de cambios (creados, actualizados o eliminados) en la respuesta de la consulta delta, puede filtrar opcionalmente el tipo de cambio deseado mediante una opción changeType
de consulta personalizada . Los valores posibles son created
, updated
o 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
Encabezado de solicitud opcional
Cada solicitud GET de la consulta delta devuelve una colección de uno o más mensajes en la respuesta. Opcionalmente se puede especificar el encabezado de solicitud, Prefer: odata.maxpagesize={x}
, para establecer el número máximo de mensajes en una respuesta.
Ejemplo 1: sincronizar mensajes en una carpeta
En el siguiente ejemplo se muestran dos rondas de sincronización de una carpeta concreta que inicialmente contiene cinco mensajes.
La primera ronda implica una serie de tres solicitudes para sincronizar los cinco mensajes de la carpeta:
- Solicitud inicial de ejemplo y respuesta
- Segunda solicitud de ejemplo y respuesta
- Tercera solicitud de ejemplo y respuesta final
Después de la primera ronda, uno de los mensajes se elimina y otro se marca como leído. La segunda ronda de sincronización devuelve solo el delta (la eliminación y actualización) sin devolver los demás mensajes que se han mantenido iguales.
Solicitud inicial de ejemplo
En este ejemplo, la carpeta especificada se sincroniza por primera vez, por lo que la solicitud de sincronización inicial no incluye ningún token de estado. Esta ronda devuelve todos los mensajes de esa carpeta.
La primera solicitud especifica lo siguiente:
- Un parámetro
$select
que devuelva las propiedadessubject
,sender
yisRead
de cada mensaje de la respuesta. - El encabezado de solicitud opcional, odata.maxpagesize, que devuelve dos mensajes a la vez.
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$select=subject,sender,isRead HTTP/1.1
Prefer: odata.maxpagesize=2
Respuesta inicial de ejemplo
La respuesta incluye dos mensajes y un encabezado de respuesta @odata.nextLink
.
La dirección URL @odata.nextLink
indica que la carpeta contiene más mensajes que recuperar.
{
"@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=="
}
]
}
Segunda solicitud de ejemplo
La segunda solicitud especifica la dirección URL @odata.nextLink
devuelta de la respuesta anterior. Observe que ya no tiene que especificar el mismo parámetro $select
como en la solicitud inicial, dado que el skipToken
en la dirección URL @odata.nextLink
lo codifica y lo incluye.
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$skiptoken=GwcBoTmPuoTQWfcsAbkYM HTTP/1.1
Prefer: odata.maxpagesize=2
Segunda respuesta de ejemplo
La segunda respuesta devuelve los dos siguientes mensajes próximos en la carpeta y otro @odata.nextLink
, para indicar que hay más mensajes para obtener desde la carpeta.
{
"@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"
}
]
}
Tercera solicitud de ejemplo
La tercera solicitud continúa usando la última dirección URL @odata.nextLink
devuelta desde la última solicitud de sincronización.
GET https://graph.microsoft.com/v1.0/me/mailFolders/AQMkADNkNAAAgEMAAAA/messages/delta?$skiptoken=GwcBoTmPKILK4jLH7mAd1lLU HTTP/1.1
Prefer: odata.maxpagesize=2
Tercera y última respuesta de ejemplo
La tercera respuesta devuelve el único mensaje restante en la carpeta y una @odata.deltaLink
dirección URL que indica que la sincronización está completa por el momento para esta carpeta. Guarde y use la dirección URL @odata.deltaLink
para sincronizar la misma carpeta en la siguiente ronda.
{
"@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 los mensajes de la misma carpeta en la siguiente ronda
Con desde @odata.deltaLink
la última solicitud de la última ronda, solo puede obtener los mensajes que han cambiado (al agregar, eliminar o actualizar) en esa carpeta desde entonces.
La primera solicitud de la ronda siguiente será similar a la mostrada a continuación, suponiendo que prefiere mantener el mismo tamaño de página máximo en la respuesta:
GET https://graph.microsoft.com/v1.0/me/mailfolders/AQMkADNkNAAAgEMAAAA/messages/delta?$deltatoken=GwcBoTmPuoGNlgXgF1nyUNMXY HTTP/1.1
Prefer: odata.maxpagesize=2
La respuesta contiene un @odata.deltaLink
. Esto indica que todos los cambios de la carpeta de correo remota están ahora sincronizados. Un mensaje se ha eliminado y el otro se ha cambiado.
{
"@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="
}
]
}
Ejemplo 2: Sincronizar mensajes en una carpeta en función del tipo de cambio
En el ejemplo siguiente se muestran solo los mensajes creados en una carpeta específica desde la sincronización inicial. El ejemplo implica 2 rondas de sincronización de esa carpeta que inicialmente contiene 4 mensajes.
La primera ronda implica una serie de 2 solicitudes para sincronizar los 4 mensajes de la carpeta:
- Solicitud inicial de ejemplo con el tipo de cambio y la respuesta especificados
- Segunda solicitud de ejemplo con el tipo de cambio y la respuesta especificados
Después de la primera ronda, se crean dos mensajes más, se elimina un mensaje y otro se marca como leído.
La segunda ronda de sincronización devuelve solo los cambios en la carpeta del tipo de created
cambio (los dos nuevos mensajes creados), sin devolver los demás mensajes que han permanecido iguales, eliminados o actualizados desde la última sincronización.
Solicitud inicial de ejemplo con el tipo de cambio especificado
En este ejemplo, la carpeta especificada se sincroniza por primera vez, por lo que la solicitud de sincronización inicial no incluye ningún token de estado. Esta ronda devuelve todos los mensajes de esa carpeta.
La primera solicitud especifica lo siguiente:
- Parámetro
changeType
para devolver solo los mensajes creados en la respuesta delta posterior. - Un parámetro
$select
que devuelva las propiedadessubject
,sender
yisRead
de cada mensaje de la respuesta. - El encabezado de solicitud opcional, odata.maxpagesize, que devuelve dos mensajes a la 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
Respuesta inicial de ejemplo con el tipo de cambio especificado
La respuesta incluye dos mensajes y un encabezado de respuesta @odata.nextLink
.
La dirección URL @odata.nextLink
indica que la carpeta contiene más mensajes que recuperar.
{
"@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"
}
}
}
]
}
Segunda solicitud de ejemplo con el tipo de cambio especificado
La segunda solicitud especifica la dirección URL @odata.nextLink
devuelta de la respuesta anterior. Tenga en cuenta que ya no tiene que especificar el mismo parámetro o el changeType
mismo $select
que en la solicitud inicial, ya que en skipToken
la @odata.nextLink
dirección URL lo codifica e incluye.
GET https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$skiptoken=P4lmXpjPRrjB6haAQzSkpK89jYTVD2kVtOeXNRnfYzPbCs HTTP/1.1
Prefer: odata.maxpagesize=2
Segunda respuesta de ejemplo con el tipo de cambio especificado
La segunda respuesta devuelve los dos mensajes siguientes en la carpeta y @odata.deltaLink
la dirección URL que indican que la sincronización está completa por el momento para esta carpeta. Guarde y use la dirección URL @odata.deltaLink
para sincronizar la misma carpeta en la siguiente ronda.
{
"@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 mensajes en la misma carpeta en la siguiente ronda en función del tipo de cambio especificado
Con desde @odata.deltaLink
la última respuesta de la última ronda, solo puede obtener los mensajes que se han agregado a esa carpeta desde entonces.
La primera solicitud de la ronda siguiente será similar a la mostrada a continuación, suponiendo que prefiere mantener el mismo tamaño de página máximo en la respuesta:
GET https://graph.microsoft.com/v1.0/me/mailFolders/AAMkAGUwNc4LTMzAAA=/messages/delta?$deltatoken=P4lmXpjPRrjB6haAQ_37roqIbjXe66KoV7SMlLH--Jgi8 HTTP/1.1
Prefer: odata.maxpagesize=2
La respuesta contiene un @odata.deltaLink
. Esto indica que todos los cambios de la carpeta de correo remota están ahora sincronizados. Se agregaron dos mensajes desde la última sincronización. Los mensajes actualizados & eliminar desde la última sincronización no se devuelven en esta respuesta diferencial.
{
"@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"
}
}
}
]
}