注:回答の後に追加:ありがとうございます。ええ、Flag.SEENをtrueにしてsaveChangesを試してみました。メッセージをループする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;
}
}
まず、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);
_
コピーを作成すると、sourceによって参照されるメッセージに対して、seenフラグが暗黙的に設定されます。
メッセージ全体をダウンロードせずにそれを行う1つのライナー:
単一のメッセージ:
folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);
すべてのメッセージ:
folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
この投稿は古いですが、最も簡単な解決策はまだ投稿されていません。
メッセージにアクセスしています。 message.setFlag(Flag.SEEN、true);
_for (Message message : messages) {
message.setFlag(Flags.Flag.SEEN,true);
}
_
and以下の行を変更
folder.open(Folder.READ_ONLY);
これに
folder.open(Folder.READ_WRITE);
Forループを使用してメールを1つずつ読み取るか確認する場合、コードは次のようにしてGmailメッセージを既読にすることができます。
Message[] unreadMessages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));
for (int q = 0; q < unreadMessages.length; q++) {
unreadMessages[q].setFlag(Flag.SEEN, true);
}
このコードが行うことは、1つずつ未読にすることです。
また、フォルダー/受信トレイは、READ_ONLYではなく、READ_WRITEである必要があります。
folder.open(Folder.READ_WRITE);
また、メッセージを読んだら、_public static int max_message_number
_を用意し、message[i].getMessageNumber();
に格納することもできます。次に、メッセージを読み取る前に、max_message_number < message[i].getmessageNumber()
かどうかを確認します。 trueの場合、このメッセージは出力されません(すでに読み取られているため)。
これを行う最も簡単な方法は、読み取りまたは書き込みを行うフォルダーを設定することです。このような意味...
Folder inbox = null;
inbox.open(Folder.READ_WRITE);
folderクラスをインポートする必要があります。
あなたも試すことができます
gmailの設定に移動>転送とPOP/IMAP
のドロップダウンからPOPを使用してメッセージにアクセスする場合、Gmailのコピーを既読としてマークし、変更を保存します
message.setFlag(Flag.SEEN、true)「シンボルが見つかりません」を与えるmessage.setFlag(Flags.Flag.SEEN、true)は良いようです。