web-dev-qa-db-fra.com

JavaMail lisant les mails récents non lus avec IMAP

J'ai l'obligation de récupérer les messages non lus de Gmail. J'utilise l'API Java Mail. Par défaut, cette API récupère les mails du plus ancien au plus récent. Mais je dois d'abord récupérer les mails récents. C'est possible? Merci d'avance.

10
Ram Bavireddi

Voici un exemple. N'oubliez pas d'ajouter javax.mail dans votre classpath.

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
Dmitriy Dobrotvorskiy

JavaMail vous donne un tableau d'objets Message. Les messages sont dans l'ordre de réception. Si vous souhaitez d'abord consulter les derniers messages reçus, parcourez le tableau dans l'ordre inverse. Si vous souhaitez commencer par examiner les messages les plus récents envoyés , vous devez trier le tableau, comme décrit dans l'autre réponse.

2
Bill Shannon
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