2012-03-31 13 views
11

Estoy implementando un cliente IMAP, y tengo un problema con la sincronización del buzón IMAP.Sincronización IMAP

En primer lugar, está bien obtener nuevos correos del servidor IMAP, pero no sé cómo encontrar los mensajes eliminados de un buzón.

¿Debo recuperar todos los mensajes del servidor y compararlos con los datos locales para sincronizarlos?

Respuesta

21

El enfoque habitual es ejecutar los siguientes dos comandos para cada carpeta:

. EXAMINE "<foldername>" 
. FETCH 1:* (UID FLAGS) 

El primer comando selecciona una carpeta devuelve el UIDVALIDITY de esta carpeta. Si este valor coincide con el UIDVALIDITY anteriormente devuelto para esta carpeta, puede confiar en UIDs. El segundo comando devuelve (al menos) UID y FLAGS por cada correo en la carpeta seleccionada.

  • debería usar el UID para detectar qué correos se han añadido o eliminado. Tenga en cuenta que el contenido de un correo electrónico no se puede cambiar sin cambiar el UID.
  • En IMAP básico, FLAGS son los únicos atributos que se pueden cambiar para un correo electrónico. Los indicadores contienen información sobre correos electrónicos leídos (\Seen) y correos eliminados (\Deleted).

Este enfoque es utilizado por la mayoría de los clientes, y la mayoría de los servidores IMAP están optimizados para ellos. El factor limitante es generalmente el ancho de banda disponible entre el cliente y el servidor.

Las siguientes situaciones son un poco más complicado:

  • ¿Qué se debe hacer si UIDVALIDITY no coincide? La especificación IMAP requiere que los servidores hagan todo lo posible para evitar cambios innecesarios a este valor.
  • ¿Debería haber una optimización para los correos movidos (en realidad los correos copiados)? En IMAP básico, no puede detectar que un correo electrónico sea una copia de otro correo electrónico, independientemente de si el correo electrónico en la carpeta de origen aún existe o si ya se ha eliminado y eliminado.
+1

La extensión UIDPLUS puede ayudar con los correos electrónicos movidos/copiados. Otro método para descubrir los mensajes eliminados es usar UID SEARCH: carpeta 'EXAMINE '' 'then' UID SEARCH 1: * '. Esto proporcionará una lista de todos los UID actualmente en el buzón, que se pueden comparar con su caché local. – Max