2009-05-15 17 views
7

Sto scrivendo/imparando a recuperare e-mail usando java da una cartella IMAP usando il pacchetto javax.mail. Sono riuscito a recuperare gli ultimi n messaggi in una cartella, tuttavia sto cercando di creare un esempio per recuperare i messaggi da una data specifica. Qualche esempio?java imap recupera messaggi da una data

+0

correlati: http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to- il secondo – kevinarpe

risposta

22

È anche possibile utilizzare le classi SearchTerm nel pacchetto 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); 

Alcune combinazioni di quanto sopra dovrebbero rivelarsi un modo migliore per ottenere date entro un determinato intervallo.

+1

Sto cercando di usare receivedDateTerm ma sembra che non mi stia restituendo il risultato corretto. Voglio solo recuperare tutte le e-mail ricevute negli ultimi 1 minuti o tutte le e-mail ricevute dal momento in cui è iniziato il mio test. Non funziona come previsto .. questo è quello che sto facendo. 'SearchTerm st = new AndTerm (new SubjectTerm (subjectSearchPhrase), new BodyTerm (bodySearchPhrases)); st = new AndTerm (st, nuovo ReceivedDateTerm (ComparisonTerm.GE, searchMailReceivedDateGE)); 'Ho anche provato a usare' YoungerTerm (80) 'e anche questo non funziona. qualcuno conosce il problema? Grazie! – OverrockSTAR

+0

Una cosa da notare: IMAP può cercare solo per lo sate, non per il tempo, quindi se si vogliono ottenere tutti i nuovi messaggi dall'ultimo aggiornamento, dovranno impostare l'ora della loro data di confronto a mezzanotte e fare ulteriori controlli rispetto a duplicati sul client. – Tobl

0

Ecco cosa mi è venuto in mente. Questo funziona per me, ma probabilmente non è il modo migliore per farlo. Qualche suggerimento per migliorare questo?

 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

Sicuramente non è un buon approccio dato che recupera prima le e-mail senza filtrarle con le capacità IMAP. Credo che il decuplicato incremento non lo renda molto più bello (immagina 10k email nella scatola) – Konstantin

2

Invece di recuperare tutti i messaggi si dovrebbe provare a sfruttare la ricerca lato server. Questo funziona utilizzando la ricerca metodo di javax.mail.Folder. Probabilmente dovrai scrivere il tuo SearchTerm in base a un criterio su Message.getReceivedDate().

Se la ricerca lato server non funziona, è possibile provare a utilizzare un profilo di recupero, ad esempio anziché inbox.getMessages() utilizzare inbox.fetch (Messaggio [] msgs, FetchProfile fp). javadoc for fetch dice: I client utilizzano questo metodo per indicare che gli elementi specificati sono necessari in blocco per l'intervallo di messaggi specificato. Si prevede che le implementazioni recuperino questi articoli per l'intervallo di messaggi specificato in modo efficiente. Si noti che questo metodo è solo un suggerimento all'implementazione per precedere gli elementi desiderati.

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

Tutte le poste nel corso dell'ultimo mese:

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