注: 回答後に追加: ありがとうございます。はい、Flag.SEEN を true にして saveChanges を試しました。また、getContent を読み取り済みとしてマークしました。メッセージをループする for ステートメントで使用してみました。しかし、次のループでとにかくフォルダーからメッセージを再度取得しました。フォルダーはライブであると想定していたため、コンテンツを取得してから、フィルターを使用してフォルダーからメッセージを再度取得して、何も表示されないようにすると機能するはずですが、同じメッセージが表示されました。テストとしてフォルダーを閉じて再度開き、マークされているかどうかを確認できます。また、クライアントに移動してメッセージをクリックすると、ループ内でもコードがメッセージを表示しなくなるため、コードで同じことを行うことを期待していました。
オリジナル: Gmail アカウントからメールを取得するために javamail を使用していますが、うまく機能しています。メッセージを受け取ったら、それを既読としてマークしたいのですが、どなたか指示をいただけませんか? 現在のコードは次のとおりです:
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", eUserName, ePassWord);
// Get folder
Folder folder = store.getFolder("INBOX");
if (folder == null || !folder.exists()) {
return null;
}
folder.open(Folder.READ_ONLY);
// Only pull unread
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
Message messages[]; // = folder.search(ft);
for(int x = 0; x < timeOutInSeconds; x++) {
log.reportMessage("looking for emails");
try {
folder.getMessages();
messages = folder.search(ft);
if (messages.length > 0) {
for (Message message : messages) {
//log.reportMessage("found message: should not see again, marking read");
// want to mark as read
}
}
Thread.sleep(1000);
}
catch(Exception ex) {
}
}
// Close connection
folder.close(false);
store.close();
return null;
}
catch (NoSuchProviderException ex) {
return null;
}
catch (MessagingException ex) {
return null;
}
}
ベストアンサー1
まず、POP3 サーバーを使用している場合、メッセージを既読としてマークすることはできません。POP3 プロトコルはこれをサポートしていません。ただし、IMAP v4 プロトコルはサポートしています。
これを行うには、メッセージを取得し、フラグをFlags.Flag.SEEN
true に設定してから を呼び出す必要があると思われるかもしれませんmessage.saveChanges()
。奇妙なことに、そうではありません。
代わりに、JavaMail API 設計仕様の第 4 章の「フラグ クラス」のセクションでは、SEEN
メッセージの内容が取得されるときにフラグが暗黙的に設定されると説明されています。したがって、メッセージを既読としてマークするには、次のコードを使用できます。
myImapFolder.open(Folder.READ_WRITE);
myImapFolder.getMessage(myMsgID).getContent();
myImapFolder.close(false);
または、別の方法として、MimeMessage コピー コンストラクターを使用します。
MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);
コピーを作成すると、ソースによって参照されるメッセージに対して、seen フラグが暗黙的に設定されます。