2009-05-15 13 views
7

Ich schreibe/lernen, E-Mail mit Java aus einem IMAP-Ordner mit javax.mail-Paket abrufen. Ich konnte die letzten n Nachrichten in einem Ordner erfolgreich abrufen. Ich möchte jedoch ein Beispiel erstellen, um Nachrichten seit einem bestimmten Datum abzurufen. Irgendwelche Beispiele?java imap fetch Nachrichten seit einem Datum

+0

Verwandte: http://stackoverflow.com/questions/6963256/javamail-search-by-receiveddate-doesnt-work-down-to- die Sekunde – kevinarpe

Antwort

22

Sie könnten auch die SearchTerm-Klassen im Java-Mail-Paket verwenden.

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

Eine Kombination der oben genannten sollte sich als eine bessere Möglichkeit, Daten in einem bestimmten Bereich zu erhalten, erweisen.

+1

Ich versuche receivedDateTerm zu verwenden, aber es scheint, dass es mir kein korrektes Ergebnis zurückgibt. Ich möchte nur alle Mails abrufen, die ich in den letzten 1 Minuten erhalten habe, oder alle E-Mails, die ich seit dem Start meines Tests erhalten habe. Es funktioniert nicht wie erwartet .. das ist was ich mache. 'SearchTerm st = neu AndTerm (neues SubjectTerm (subjectSearchPhrase), neues BodyTerm (bodySearchPhrases)); st = new AndTerm (st, neu ReceivedDateTerm (ComparisonTerm.GE, searchMailReceivedDateGE)); 'Ich habe auch versucht,' YoungerTerm (80) 'zu verwenden, und das funktioniert auch nicht. kennt jemand das Problem? Vielen Dank! – OverrockSTAR

+0

Eine Sache zu beachten: IMAP kann nur nach Sate und nicht nach Zeit suchen. Wenn Sie also alle neuen Mails seit dem letzten Update erhalten möchten, müssen sie die Zeit ihres Vergleichsdatums auf Mitternacht setzen und weitere Prüfungen vornehmen Duplikate auf dem Client. – Tobl

0

Hier ist, was ich gefunden habe. Das funktioniert für mich, aber wahrscheinlich nicht der beste Weg. Irgendwelche Vorschläge, um das zu verbessern?

+2

Definitiv kein guter Ansatz, da die E-Mails zuerst abgerufen werden, ohne sie mit IMAP-Funktionen zu filtern. Ich glaube, dass die zehnfache Erhöhung es nicht viel schöner macht (stellen Sie sich 10k E-Mails in der Box vor) – Konstantin

2

Anstatt alle Nachrichten abzurufen, sollten Sie versuchen, die serverseitige Suche zu nutzen. Dies funktioniert mit der Suche Methode javax.mail.Folder. Sie müssen wahrscheinlich Ihr eigenes SearchTerm basierend auf einem Kriterium in Message.getReceivedDate() schreiben.

Wenn serverseitige Suche nicht funktioniert, können Sie versuchen, ein Abrufprofil zu verwenden, d. H. Anstelle von inbox.getMessages() verwenden Sie inbox.fetch (Message [] msgs, FetchProfile fp). Das Javadoc zum Abrufen sagt: Clients verwenden diese Methode, um anzugeben, dass die angegebenen Elemente für den angegebenen Nachrichtenbereich en masse benötigt werden. Es wird erwartet, dass Implementierungen diese Elemente für den gegebenen Nachrichtenbereich auf effiziente Weise abrufen. Beachten Sie, dass diese Methode nur ein Hinweis auf die Implementierung ist, um die gewünschten Elemente vorab abzurufen.

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

Alle E-Mails im letzten Monat:

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