Gmailから未読メールを取得する必要があります。 Java Mail APIを使用しています。デフォルトでは、このAPIはメールを最も古いものから新しいものへと取得しますが、最近のメールを最初に取得する必要があります。それは可能ですか?よろしくお願いします。
ここに例があります。クラスパスに 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() );
}
}
}
フラグ付けをサポートしているため、必ず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);
}
}
}
JavaMailは、メッセージオブジェクトの配列を提供します。メッセージは受信した順番です。最近受信したメッセージを最初に確認する場合は、逆の順序で配列を調べます。最近の送信済みメッセージを最初に確認したい場合は、他の回答で説明されているように、配列をソートする必要があります。
私はこれが既読/未読/最近のメールにアクセスするのに役立つかもしれないと思いますあなたの必要に応じてあなたの変数を変更します。
// 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);