javamail将gmail消息标记为已读

注意:回答后添加:谢谢..是的,我曾尝试过Flag.SEEN为true和saveChanges ..我也读过了读取的getContent标记。 我尝试在循环消息的for语句中使用它。 但是我在下一个循环中再次从文件夹中获取了消息。 我假设文件夹是实时的,所以抓住内容,然后从filter的文件夹中再次抓取消息,以便没有看到应该工作,但我仍然得到相同的消息。 我可以尝试关闭文件夹并重新打开作为测试,以查看它是否已标记。 此外,如果我转到我的客户端并单击该消息,那么我的代码即使在循环中也会停止查看它,所以我希望在代码中也这样做。

original:我正在使用javamail从gmail帐户获取电子邮件,它工作得很好,当我收到消息时我想将其标记为已阅读,是否有人可以给我一些指示? 这是我目前的代码:

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  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); 

构造副本时,将为源引用的消息隐式设置seen标志。

一个class轮将完成它而不下载整个消息:

单个消息:

 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);

您还可以考虑使用public static int max_message_number ,并在其中存储message[i].getMessageNumber(); 一旦你阅读了一条消息。 然后在阅读任何消息之前,只需检查max_message_number < message[i].getmessageNumber() 。 如果为true则不要打印此消息(因为它已被读取)

如果您使用for循环逐个读取或检查邮件,则代码可以如下所示将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); } 

这段代码的作用是让它一个接一个地被读取。

文件夹/收件箱也需要READ_WRITE,而不是READ_ONLY:

 folder.open(Folder.READ_WRITE); 

message.setFlag(Flag.SEEN,true)给出“找不到符号”的消息.setFlag(Flags.Flag.SEEN,true)似乎不错。

最简单的方法是设置要读取或写入的文件夹。 像这样的手段……

  Folder inbox = null; inbox.open(Folder.READ_WRITE); 

应该导入Folder类。

 for (Message message : messages) { message.setFlag(Flags.Flag.SEEN,true); } 

改变以下行

folder.open(Folder.READ_ONLY);

对此

folder.open(Folder.READ_WRITE);