2015-02-24 26 views

risposta

14

Ecco un esempio. Non dimenticare di aggiungere javax.mail nel 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()); 
    } 
    } 
} 
1

JavaMail fornisce una serie di oggetti Messaggio. I messaggi sono nell'ordine ricevuto. Se si desidera esaminare prima i messaggi ricevuti più di recente, passare attraverso l'array nell'ordine inverso. Se si desidera visualizzare l'ultimo messaggio inviato, è necessario ordinare l'array, come descritto nell'altra risposta.

+0

Penso di sapere qual è il suo problema. Almeno sembra una di quelle che avevo: se si desidera aggiornare prontamente lo schermo dopo l'azione dell'utente, l'ordine di risposta FETCH della maggior parte dei server IMAP non è buono. "Prima l'UID più alto" sarebbe meglio di "prima l'UID più basso". Ma questo non è qualcosa che Javamail può risolvere. – arnt

0
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

Perché è necessario? C'è una risposta accettata che ha tre anni ... –