javamail将gmail消息标记为已读

Gre*_*een 32 java jakarta-mail

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

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


}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ler 50

首先,如果您使用的是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);
Run Code Online (Sandbox Code Playgroud)

或者另一种方法是使用MimeMessage复制构造函数,即:

MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);
Run Code Online (Sandbox Code Playgroud)

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

  • `getContent()`_ will not_将消息标记为已读,如果它是MIME消息,至少在我使用的IMAP中.这不应该是公认的答案,使用Shloim或James Vornhagen的答案.并记住测试所有可能的情况,因为每个IMAP实现都不同. (6认同)
  • 好的,在再次查看您的代码后,我注意到您使用了Folder.READ_WRITE并且我正在使用READ_ONLY.我一改变它就按预期工作了.谢谢 (5认同)

Shl*_*oim 37

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

单个消息:

folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);
Run Code Online (Sandbox Code Playgroud)

所有消息:

folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。只需切换到读写模式,如下所示:`emailFolder.open(Folder.READ_WRITE);` (2认同)