2009-05-15 29 views
7

Estoy escribiendo/aprendiendo a buscar correo electrónico utilizando java desde una carpeta IMAP usando el paquete javax.mail. Logré recuperar los últimos n mensajes en una carpeta, sin embargo, estoy buscando construir un ejemplo para recuperar mensajes desde una fecha específica. ¿Algún ejemplo?java imap recuperar mensajes desde una fecha

+0

relacionadas: http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to- el segundo – kevinarpe

Respuesta

22

También podría usar las clases de SearchTerm en el paquete java mail.

SearchTerm olderThan = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate); 
SearchTerm newerThan = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate); 
SearchTerm andTerm = new AndTerm(olderThan, newerThan); 
inbox.search(andTerm); 

Alguna combinación de lo anterior debería ser una mejor forma de obtener fechas dentro de un cierto rango.

+1

Estoy tratando de usar receivedDateTerm pero parece que no me devuelve el resultado correcto. Solo quiero recuperar todos los correos recibidos en los últimos 1 minuto o todos los correos recibidos desde el momento en que comenzó mi prueba. No está funcionando como se esperaba ... esto es lo que estoy haciendo. 'SearchTerm st = new AndTerm (nueva SubjectTerm (subjectSearchPhrase), nueva BodyTerm (bodySearchPhrases)); st = new AndTerm (st, new ReceivedDateTerm (ComparisonTerm.GE, searchMailReceivedDateGE)); 'También he intentado usar' YoungerTerm (80) 'y esto tampoco funciona. alguien sabe el problema? ¡Gracias! – OverrockSTAR

+0

Una cosa a tener en cuenta: IMAP solo puede buscar por estado, no por tiempo, por lo que si desea recibir todos los correos nuevos desde la última actualización, deberán establecer la fecha de comparación hasta la medianoche y realizar una nueva comprobación duplicados en el cliente. – Tobl

0

Esto es lo que se me ocurrió. Esto funciona para mí, pero probablemente no sea la mejor manera de hacerlo. Alguna sugerencia para mejorar esto?

 Date from; //assume initialized 
     Store store; //assume initialized 
     Folder inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_ONLY); 
     int end = inbox.getMessageCount(); 
     long lFrom = from.getTime(); 
     Date rDate; 
     long lrDate; 
     int start = end; 
     do { 
     start = start - 10; 
     Message testMsg = inbox.getMessage(start); 
     rDate = testMsg.getReceivedDate(); 
     lrDate = rDate.getTime(); 
     } while (lrDate > lFrom); 
     Message msg[] = inbox.getMessages(start, end); 
     for (int i=0, n=msg.length; i<n; i++) { 
     lrDate = msg[i].getReceivedDate().getTime(); 
     if (lrDate > lFrom) { 
      System.out.println(i + ": " 
      + msg[i].getFrom()[0] 
      + "\t" + msg[i].getSubject()); 
     } 
     } 
+2

Definitivamente no es un buen enfoque, ya que primero busca los correos electrónicos sin filtrarlos con las capacidades de IMAP. Creo que el incremento de diez veces no lo hace mucho mejor (imagine 10k correos electrónicos en el recuadro) – Konstantin

2

En lugar de buscar todos los mensajes, intente aprovechar la búsqueda del lado del servidor. Esto funciona utilizando el método de búsqueda de javax.mail.Folder. Probablemente tengas que escribir tu propio SearchTerm basado en un criterio en Message.getReceivedDate().

Si la búsqueda del servidor no funciona, puede intentar usar un perfil de búsqueda, es decir, en lugar de inbox.getMessages() use inbox.fetch (Message [] msgs, FetchProfile fp). El javadoc for fetch dice: Los clientes usan este método para indicar que los artículos especificados son necesarios en masa para el rango de mensajes dado. Se espera que las implementaciones recuperen estos elementos para el rango de mensajes dado de una manera eficiente. Tenga en cuenta que este método es solo una pista para la implementación para captar previamente los elementos deseados.

5
public class CheckDate { 
    public void myCheckDate(Date givenDate) { 
     SearchTerm st = new ReceivedDateTerm(ComparisonTerm.EQ,givenDate); 

     Message[] messages = inbox.search(st); 
    } 

    // in main method 

    public static void main(String[] args) throws ParseException{ 
     SimpleDateFormat df1 = new SimpleDateFormat("MM/dd/yy"); 
     String dt="06/23/10"; 
     java.util.Date dDate = df1.parse(dt); 
     cd.myCheckDate(dDate); 
    } 
} 
0

Todos los correos en el último mes:

Calendar cal = Calendar.getInstance(); 
    cal.roll(Calendar.MONTH, false); 
    Message[] search = folder.search(new ReceivedDateTerm(ComparisonTerm.GT, cal.getTime()));