У меня есть требование получить непрочитанные письма из Gmail. Я использую Java Mail API. По умолчанию этот API получает сообщения от самых старых до новейших. Но сначала мне нужно получить последние письма. Является ли это возможным? Спасибо заранее.
JavaMail читает последние непрочитанные письма с использованием протокола IMAP
Ответ 1
Вот пример. Не забудьте добавить javax.mail в свой путь к классам.
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() );
}
}
}
Ответ 2
JavaMail предоставляет вам массив объектов Message. Сообщения находятся в полученном порядке. Если вы хотите сначала просмотреть самые последние полученные сообщения, пройдите через массив в обратном порядке. Если вы хотите сначала просмотреть последние сообщения отправленные, вам нужно будет отсортировать массив, как описано в другом ответе.
Ответ 3
Убедитесь, что вы используете протокол IMAP, так как он поддерживает маркировку.
Сделайте следующие изменения в вашем коде:
- заменить
inbox.open( Folder.READ_ONLY );
отinbox.open( Folder.READ_WRITE );
-
Затем, прочитав сообщение, установите флаг следующим образом:
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);
}
}
}
Ответ 4
Я думаю, что это может помочь получить доступ к прочитанным/непрочитанным/недавним письмам и изменить ваши переменные в соответствии с вашими потребностями.
// 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);