webentwicklung-frage-antwort-db.com.de

JavaMail liest zuletzt ungelesene Mails mit IMAP

Ich muss ungelesene E-Mails von Google Mail abrufen. Ich verwende Java Mail API. Standardmäßig ruft diese API E-Mails vom ältesten zum neuesten ab. Ich muss jedoch erst die letzten Mails abrufen. Ist es möglich? Danke im Voraus.

10
Ram Bavireddi

Hier ist ein Beispiel. Vergessen Sie nicht, javax.mail in Ihren Klassenpfad einzufügen.

import javax.mail.*;
import javax.mail.search.FlagTerm;
import Java.util.*;

public class GmailFetch {

  public static void main( String[] args ) throws Exception {

    Session session = Session.getDefaultInstance(new Properties( ));
    Store store = session.getStore("imaps");
    store.connect("imap.googlemail.com", 993, "[email protected]", "password");
    Folder inbox = store.getFolder( "INBOX" );
    inbox.open( Folder.READ_ONLY );

    // Fetch unseen messages from inbox folder
    Message[] messages = inbox.search(
        new FlagTerm(new Flags(Flags.Flag.SEEN), false));

    // Sort messages from recent to oldest
    Arrays.sort( messages, ( m1, m2 ) -> {
      try {
        return m2.getSentDate().compareTo( m1.getSentDate() );
      } catch ( MessagingException e ) {
        throw new RuntimeException( e );
      }
    } );

    for ( Message message : messages ) {
      System.out.println( 
          "sendDate: " + message.getSentDate()
          + " subject:" + message.getSubject() );
    }
  }
}
21

JavaMail stellt Ihnen ein Array von Message-Objekten zur Verfügung. Die Nachrichten sind in der Reihenfolge empfangen. Wenn Sie die zuletzt empfangenen Nachrichten zuerst anzeigen möchten, gehen Sie das Array in umgekehrter Reihenfolge durch. Wenn Sie sich zuerst die sent messages anschauen möchten, müssen Sie das Array wie in der anderen Antwort beschrieben sortieren.

2
Bill Shannon

Ich denke, dies könnte helfen, auf gelesene/ungelesene/aktuelle Mails zuzugreifen. Ändere deine Variablen entsprechend deinen Bedürfnissen.

// search for all "unseen" messages

Flags seen = new Flags(Flags.Flag.SEEN);// try changing this SEEN to RECENT 

// set it true or false for seen & unseen mail

FlagTerm unseenFlagTerm = new FlagTerm(seen, false)
Message messages[] = inbox.search(unseenFlagTerm);
0
Vikash Kumar
make sure you have to use imap protocal, it support for flaging.
    do fallowing change at your code. 
    inbox.open( Folder.READ_ONLY ); need to change to inbox.open( Folder.READ_WRITE ); then after reading message need to set the flag like below  message.setFlag(Flags.Flag.SEEN, true); 

    import javax.mail.*;
    import javax.mail.search.FlagTerm;
    import Java.util.*;

    public class GmailFetch {

      public static void main( String[] args ) throws Exception {

        Session session = Session.getDefaultInstance(new Properties( ));
        Store store = session.getStore("imaps");
        store.connect("imap.googlemail.com", 993, "[email protected]", "password");
        Folder inbox = store.getFolder( "INBOX" );
        inbox.open( Folder.READ_WRITE );

        // Fetch unseen messages from inbox folder
        Message[] messages = inbox.search(
            new FlagTerm(new Flags(Flags.Flag.SEEN), false));

        // Sort messages from recent to oldest
        Arrays.sort( messages, ( m1, m2 ) -> {
          try {
            return m2.getSentDate().compareTo( m1.getSentDate() );
          } catch ( MessagingException e ) {
            throw new RuntimeException( e );
          }
        } );

        for ( Message message : messages ) {
          System.out.println( 
              "sendDate: " + message.getSentDate()
              + " subject:" + message.getSubject() );
 message.setFlag(Flags.Flag.SEEN, true);
        }
      }
    }
0
sangamesh