Ho un obbligo di recuperare le mail non lette da Gmail. Sto usando Java Mail API. Per impostazione predefinita, questa API recupera i messaggi dal più vecchio al più recente. Ma prima devo recuperare i messaggi recenti. È possibile? Grazie in anticipo.JavaMail che legge le e-mail recenti non lette usando IMAP
6
A
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
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 ... –
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