2009-07-05 12 views
18

Estoy escribiendo una aplicación cliente que recupera los correos electrónicos de un servidor IMAP y los almacena en una base de datos. El problema es que una vez que haya revisado el correo, la próxima vez solo quiero descargar el correo que ha llegado desde entonces. Entonces, si había revisado el servidor por correo hace dos horas, solo quiero recibir el correo que ha llegado en las últimas dos horas.Obteniendo solo correo nuevo de un servidor IMAP

Podría usar SEARCH con SINCE DATE, pero no hay soporte para time + date que se pueda falsificar fácilmente.

También probé la bandera RECIENTE, pero eso no parece funcionar con gmail (en ruby ​​muestra nil everytime).

Respuesta

40

Desea utilizar UniqueID (UID) para los mensajes. Esto es específicamente por lo que fue creado.

Deseará realizar un seguimiento del último UID solicitado y luego, para solicitar todos los mensajes nuevos, utilice el mensaje establecido "[UID]: *", donde [UID] es el valor UID real.

Por ejemplo, digamos que el último mensaje feteched tenía una identificación única de "123456". Usted se vendería

123456: *

A continuación, se descarta el primer mensaje devuelto.

Se supone que los UID son estables en todas las sesiones, nunca cambian y siempre aumentan su valor. El truco para verificar esto es verificar la UIDValidity cuando selecciona la carpeta. Si el número de UIDValidity no ha cambiado, los UIDs aún deberían ser válidos en todas las sesiones.

Estas son las partes pertinentes de la RFC:

2.3.1.1. Identificador único (UID) Mensaje Attribute

Un valor de 32 bits asignado a cada mensaje, que cuando se utiliza con el valor de vigencia de identificador único (ver más abajo) forma un valor de 64 bits que no debe hacer referencia a cualquier otro mensaje en el buzón o en cualquier buzón posterior con el mismo nombre para siempre. Los identificadores únicos se asignan de manera estrictamente ascendente en el buzón; como cada mensaje se agrega al buzón, se le asigna un UID más alto que el mensaje que se agregó anteriormente. A diferencia de los números de secuencia de mensaje , los identificadores únicos no son necesariamente contiguos.

El identificador único de un mensaje NO DEBE cambiar durante la sesión , y NO DEBE cambiar entre sesiones. Cualquier cambio de identificadores únicos entre sesiones DEBE ser detectable mediante el mecanismo de UIDVALIDITY que se describe a continuación.Se requieren identificadores únicos persistentes para que un cliente vuelva a sincronizar su estado de una sesión anterior con el servidor (por ejemplo, clientes de acceso desconectado o fuera de línea); esto se discute más a fondo en [IMAP-DISC].

Nota: El siguiente valor de identificador único está destinado a proporcionan un medio para un cliente para determinar si alguna de entrega del mensaje en el buzón desde el vez anterior que lo revisen este valor.

Aquí está el enlace con más información:

http://www.faqs.org/rfcs/rfc3501.html

Lo que yo haría, también un seguimiento de la INTERNALDATE de los mensajes descargados. De esta forma, si alguna vez pierde la sincronización UID, puede al menos repetir los mensajes y encontrar el último que descargó, en función del día interno del mensaje.

+0

sí, esto es perfecto! asegúrese de ejecutar el comando "UID 123: *" en lugar de solo "123: *", que arroja resultados inesperados, por ej. client.Folders.Inbox.Search ("UID 123: *") –

4

Hay una bandera imap llamada "visto". La mayoría de los clientes marcarían un mensaje que se ve al ver el mensaje, por lo que querrá iterar sobre los mensajes en el servidor que no tienen establecido ese indicador.

Aquí hay un fragmento de código que debería darle la idea correcta. El bit operativo por supuesto es

imap.search(["NOT", "SEEN"]).each do bla.bla.bla 
+0

gracias, pero mi aplicación no es la única que tiene acceso a esa cuenta de correo electrónico. Por ejemplo, un mensaje en particular podría haber sido leído en perspectiva, y por lo tanto marcado como "visto". Usar "visto" haría que mi aplicación lo pierda. –

+0

En ese caso, es posible que desee iterar sobre los encabezados de Id. De mensaje en el correo del servidor y compararlos con los que tiene en la base de datos. http://www.freesoft.org/CIE/RFC/850/10.htm – JosefAssad

0

Si usted es capaz de filtrar el correo entrante en una carpeta IMAP específica en el lado del servidor, la aplicación puede leer nuevos mensajes en esa carpeta y luego los trasladan a la bandeja de entrada estándar carpeta después de que está hecho.

Cuestiones relacionadas