ruby-on-rails - from - send mailer rails
Obteniendo solo correo nuevo de un servidor IMAP (3)
Desea utilizar el ID único (UID) para los mensajes. Esto es específicamente por qué fue creado.
Deseará realizar un seguimiento del último UID solicitado y, a continuación, solicitar todos los mensajes nuevos que utilice el conjunto de mensajes "[UID]: *", donde [UID] es el valor real de UID.
Por ejemplo, digamos que el último mensaje que se obtuvo tuvo un ID exclusivo de "123456". Tu iras a buscar
123456: *
Luego, descartar el primer mensaje devuelto.
Se supone que los UID son estables en todas las sesiones, y nunca cambian, y siempre aumentan de valor. El truco para verificar esto, es verificar la validez de UID cuando selecciona la carpeta. Si el número de UIDValidity no ha cambiado, entonces los UID deberían seguir siendo válidos en todas las sesiones.
Aquí están las partes relevantes del RFC:
2.3.1.1. Atributo de mensaje de identificador único (UID)
Un valor de 32 bits asignado a cada mensaje, que cuando se usa con el valor de validez del identificador único (ver a continuación) forma un valor de 64 bits que NO DEBE hacer referencia a ningún otro mensaje en el buzón o cualquier buzón posterior con el mismo nombre para siempre. Los identificadores únicos se asignan de forma estrictamente ascendente en el buzón; a medida que se agrega cada mensaje al buzón, se le asigna un UID más alto que los mensajes que se agregaron anteriormente. A diferencia de los números de secuencia de mensajes, 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 utilizando el mecanismo 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 desconectados o con acceso fuera de línea); esto se discute más adelante en [IMAP-DISC].
Nota: el siguiente valor de identificador único está destinado a proporcionar un medio para que un cliente determine si se han entregado mensajes al buzón desde la última vez que verificó este valor.
Aquí está el enlace con más información:
http://www.faqs.org/rfcs/rfc3501.html
Lo que haría, es también hacer un seguimiento de la Fecha Interna de los mensajes descargados. De esta manera, si alguna vez pierde la sincronización de UID, al menos puede recorrer los mensajes y encontrar el último que descargó, según la fecha interna del mensaje.
Estoy escribiendo una aplicación cliente que recupera correos electrónicos de un servidor IMAP y luego los almacena en una base de datos. El problema es que una vez que he revisado el correo, la próxima vez solo quiero descargar el correo que ha llegado desde entonces. Por lo tanto, si hace dos horas revisé el servidor para ver si había correo, solo quiero recibir el correo que llegó en las últimas dos horas.
Podría usar SEARCH with SINCE DATE, pero no hay soporte para la hora y la fecha se podría falsificar fácilmente.
También probé el indicador RECIENTE, pero eso no parece funcionar con gmail (en ruby se muestra cero cada vez).
Hay una bandera imap llamada "vista". La mayoría de los clientes marcarían un mensaje visto al ver el mensaje, por lo que desearía iterar sobre los mensajes en el servidor que no tienen ese indicador establecido.
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
Si puede filtrar el correo entrante en una carpeta IMAP específica en el lado del servidor, su aplicación puede leer los mensajes nuevos en esa carpeta y luego moverlos a la carpeta INBOX estándar una vez que haya terminado.