Java メール API を使用して IMAP クライアントを実装しています。私が欲しいのは、メール数とメールに加えられた変更 (既読/未読など) について通知を受けることです。このために、開いた IMAP フォルダーに対して次のように 2 つのリスナーを作成しました。
IMAPStore imapStore = (IMAPStore) session.getStore("imaps");
imapStore.connect();
final IMAPFolder folder = (IMAPFolder) imapStore.getFolder("Inbox");
folder.open(IMAPFolder.READ_WRITE);
folder.addMessageCountListener(new MessageCountListener() {
public void messagesAdded(MessageCountEvent e) {
System.out.println("Message Count Event Fired");
}
public void messagesRemoved(MessageCountEvent e) {
System.out.println("Message Removed Event fired");
}
});
folder.addMessageChangedListener(new MessageChangedListener() {
public void messageChanged(MessageChangedEvent e) {
System.out.println("Message Changed Event fired");
}
});
そして、次のように IMAP IDLE コマンドを別のスレッドでサーバーに送信しています。
Thread t = new Thread(new Runnable() {
public void run() {
try {
while (true) {
folder.idle();
}
} catch (MessagingException ex) {
//Handling exception goes here
}
}
});
t.start();
しかし、問題は、新しいメールが来るかメールが削除されるたびに「MessageCountListener」が起動されることです。しかし、メールが変更されたとき、「MessageChangedListener」は起動されません。