2011-08-05 18 views
7

En IMAP, la numeración de mensajes se basa en cuándo se coloca un mensaje en una carpeta (es decir, el primer mensaje en la carpeta es 1, el segundo mensaje en es 2, etc.). Sin embargo, este orden no tiene en cuenta la fecha de recepción de un mensaje. Lo que me preocupa son los mensajes anteriores al mensaje número 1 de la carpeta, es decir, un mensaje que un usuario ha movido manualmente a una carpeta (y no cuando se recibió en el sistema).Búsqueda de JavaMail por ReceivedDate, no funciona en el segundo?

No puedo obtener todos los mensajes recibidos, ya que esto es horrendoulsy ineficaz.

I pensaron que podía hacer una búsqueda JavaMail para obtener todos los mensajes con una fecha de recepción mayores de la fecha de recepción del primer mensaje, (y así mismo a continuación, hacer una búsqueda para obtener toda mensaje con una fecha de recibido para nueva que la fecha de recepción del primer mensaje ... que serían muchas, pero mientras necesito procesar TODAS las anteriores, solo necesito procesar algunas de las más recientes, (y por proceso, me refiero a descargar sus encabezados).

sin embargo, cuando estoy usando la búsqueda, simplemente no parece funcionar bien.

 Message[] messages = csqFolder.getMessages();   

     if (messages != null && messages.length > 0) { 

      Date receivedDate = messages[0].getReceivedDate(); 
      log.trace("Message 1 receivedDate: <" + receivedDate.toString() + ">"); 
      SearchTerm msgsOlderThanOETFirst = 
       new ReceivedDateTerm(DateTerm.LT, receivedDate); 

      SearchTerm msgsNewerThanFirst = 
       new ReceivedDateTerm(DateTerm.GT, receivedDate); 

      Message[] oldMsgs = csqFolder.search(msgsOlderThanOETFirst, messages); 
      log.trace("Size of oldMsgs: <" + oldMsgs.length + ">"); 
      Message[] newMsgs = csqFolder.search(msgsNewerThanFirst, messages); 
      log.trace("Size of newMsgs: <" + newMsgs.length + ">"); 

Sin embargo, cuando ejecuto estas búsquedas, no parece dar los resultados correctos.

En una carpeta con 8 mensajes, 7 de los cuales tienen una fecha de recepción de alrededor de 12:00 p. M. El 5 de agosto, pero el primer mensaje en la carpeta que es a las 4:00 p. M. El 5 de agosto veremos los siguientes:

Message 1 receivedDate: <Fri Aug 05 16:46:57 CDT 2011> 
Size of oldMsgs: <0> 
Size of newMsgs: <7> 

Sin embargo, todos los siete mensajes restantes son mayores que el primer mensaje ... que debe ser todo en oldMsgs.

Dicho esto, SI puse un mensaje del día anterior (4 de agosto) en esa carpeta, la búsqueda funcionará ... para ese mensaje ONE. Es como si la búsqueda solo funciona día a día, no hasta el segundo ...

Debo notar que en el término msgsOlderThanOETFirst, originalmente estaba usando LE (de ahí el nombre), sin embargo, que daría la vuelta a las respuestas anteriores: TODOS los mensajes se encontrarían en oldMsgs.

¿Alguien más puede confirmar si este comportamiento es cierto y, de ser así, señalaría un error en Java?

He intentado buscar en el código fuente de búsqueda, pero creo que era conseguir una versión de línea de comandos de la misma y no del tipo que utiliza el paquete Javamail ....

estoy usando MS Exchange 2007 con SP1 y JavaMail 1.4.3.

Gracias por cualquier sugerencia.

ACTUALIZACIÓN: No creo que mi lectura de la orden del comparador sea incorrecta. Busque la respuesta en el siguiente hilo: java imap fetch messages since a date

Supongamos que usamos esa respuesta, y tenemos nuestros límites del 15/07/2011 al 15/09/2011. Luego, la búsqueda compara un mensaje con una fecha determinada del 8/4/2011.Entonces tendríamos lo siguiente:

           8/4/2011 <  9/15/2011 
SearchTerm olderThen = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate); 
SearchTerm newerThen = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate); 
               8/4/2011 >  7/15/2011 

Este evaluaría en true en ambos casos, que es lo que esperamos, ya la fecha se encuentra en el rango deseado.

Del mismo modo, mi código es el siguiente:

SearchTerm msgsOlderThanOETFirst = 8/4/2011 < 8/5/2011 
      new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE 
    SearchTerm msgsNewerThanFirst =  8/4/2011 > 8/5/2011 
      new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE 

Las evaluaciones anteriores a VERDADERO y FALSO son lo que yo estoy esperando, y recibirán. Sin embargo, si tomamos un mensaje dado en el 8/5/2011 12:00:00, obtenemos lo siguiente:

SearchTerm msgsOlderThanOETFirst = 8/5/2011 12:00:00 < 8/5/2011 16:46:00 
      new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE? 
    SearchTerm msgsNewerThanFirst =  8/4/2011 12:00:00 > 8/5/2011 16:46:00 
      new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE? 

excepción, no - no obtenemos que - en su lugar, se obtiene la revertir ..... es fácil pensar en círculos en este punto, pero ... He verificado esto varias veces. ¿Hay algún problema con JavaMail, o estoy completamente confundido? Por favor, corrija mi confusión si es la última.

+0

En el ejemplo de código que está recibiendo los mensajes de la carpeta variable, pero la realización de una búsqueda en la csqFolder. ¿Es esto solo un error tipográfico en tu ejemplo? – bstick12

+0

Puede intentar usar una implementación diferente de la API de JavaMail para la cual la fuente está disponible para que pueda solucionar el problema, p. http://jarvana.com/jarvana/archive-details/org/apache/geronimo/specs/geronimo-javamail_1.4_spec/1.7.1/geronimo-javamail_1.4_spec-1.7.1.jar. No hay garantías del mismo comportamiento entre implementaciones tho. – bstick12

+0

Sí, eso fue un error tipográfico. Fijo. Bueno, me estoy inclinando por la idea de que esto es un error en este momento, y si lo es, no me sirve para probarlo y depurarlo. Si una solución para esto se puso en una versión oficial de JavaMail, podría usarla, sin embargo. – Jon

Respuesta

5

Según JM desarrollador Bill Shannon, esto es una limitación del protocolo IMAP:

from Bill Shannon 
to Jonathan Hanson 
cc [email protected] 
date Wed, Aug 10, 2011 at 11:55 AM 
subject Re: Bug with searching by ReceivedDateTerms 
mailed-by oracle.com 
    Important mainly because of your interaction with messages in the conversation. 

hide details 11:55 AM (16 minutes ago) 

The searching is being done by the IMAP server, and you're running into a limitation of the IMAP protocol. 
+1

¡Muy buen seguimiento! – kevinarpe

+1

La limitación es que IMAP SEARCH ANTES solo acepta fechas (sin tiempo), sin fecha + hora, ¿verdad? (Para citar RFC 3501: "ANTES - Mensajes cuya fecha interna (sin tener en cuenta el tiempo y la zona horaria) es anterior a la fecha especificada.") – David

+0

¿Cuál es la solución de este problema? Realmente quiero filtrar correos según la hora, quiero correos recibidos solo en los últimos 2 minutos, ¿cómo puedo hacerlo? – OverrockSTAR

Cuestiones relacionadas