Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javamail将gmail邮件标记为已读_Java_Jakarta Mail - Fatal编程技术网

javamail将gmail邮件标记为已读

javamail将gmail邮件标记为已读,java,jakarta-mail,Java,Jakarta Mail,注:在回答后添加: 谢谢是的,我试过旗子。看到真的和保存更改。。我也读过它读过的getContent标记。我尝试在for语句中使用它来循环消息。但在下一个循环中,我还是从文件夹中得到了消息。我假设文件夹是活动的,所以抓取内容,然后用过滤器再次抓取文件夹中的消息以不被看到应该是可行的,但我仍然收到相同的消息。我可以尝试关闭文件夹,然后作为测试重新打开,看看它是否已标记。另外,如果我转到我的客户机并单击该消息,那么我的代码甚至在循环中也看不到它,所以我希望在代码中也这样做 原件: 我正在使用java

注:在回答后添加: 谢谢是的,我试过旗子。看到真的和保存更改。。我也读过它读过的getContent标记。我尝试在for语句中使用它来循环消息。但在下一个循环中,我还是从文件夹中得到了消息。我假设文件夹是活动的,所以抓取内容,然后用过滤器再次抓取文件夹中的消息以不被看到应该是可行的,但我仍然收到相同的消息。我可以尝试关闭文件夹,然后作为测试重新打开,看看它是否已标记。另外,如果我转到我的客户机并单击该消息,那么我的代码甚至在循环中也看不到它,所以我希望在代码中也这样做

原件: 我正在使用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;
    }


}
Properties-props=System.getProperties();
props.setProperty(“mail.store.protocol”、“imaps”);
试一试{
Session Session=Session.getDefaultInstance(props,null);
Store Store=session.getStore(“imaps”);
store.connect(“imap.gmail.com”、eUserName、ePassWord);
//获取文件夹
Folder Folder=store.getFolder(“收件箱”);
如果(folder==null | |!folder.exists()){
返回null;
}
文件夹。打开(文件夹。只读);
//只拉未读
FlagTerm ft=新FlagTerm(新标志(Flags.Flag.SEEN),false);
消息消息[];//=文件夹搜索(ft);
对于(int x=0;x0){
用于(消息:消息){
//log.reportMessage(“找到的消息:不应再次看到,标记为已读”);
//要标记为已读吗
}
}
睡眠(1000);
}
捕获(例外情况除外){
}
}
//密切联系
文件夹。关闭(false);
store.close();
返回null;
}
捕获(无此提供异常例外){
返回null;
}
捕获(消息例外){
返回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);
或者另一种方法是使用mimessage复制构造函数,即:

MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);

构建副本时,SEED标志会隐式地为源引用的消息设置。

一个行程序将在不下载整个消息的情况下执行此操作:

folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);
单一信息:

folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);
所有信息:

folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
调用
getContent()
或使用
new mimessage(original)
创建副本的其他方法会导致客户端下载整个消息,并产生巨大的性能影响

请注意,必须打开收件箱进行读写:

folder.open(Folder.READ_WRITE);

您还可以考虑使用<代码>公共静态int Max LoMaGeAgEngult,并将其存储在<代码>消息[i] .GETMasAgEngEngEnter()中;代码>只要你读到一条消息。然后在阅读任何消息之前,只需检查

max\u message\u number
。如果为true,则不要打印此消息(因为它已经被阅读过)

这篇文章很旧,但最简单的解决方案尚未发布

您正在访问该消息。 message.setFlag(Flag.SEEN,true)

message.setFlag(Flag.SEEN,true)给出“找不到符号”
message.setFlag(Flags.Flag.SEEN,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);

            }

最简单的方法是将文件夹设置为从中读取或写入。意思是这样

    Folder inbox = null;
    inbox.open(Folder.READ_WRITE);      
应该导入文件夹类

for (Message message : messages) {
                    message.setFlag(Flags.Flag.SEEN,true);
                }
更改下一行

文件夹。打开(文件夹。只读)

到此

文件夹。打开(文件夹。读写)

您也可以尝试

转到gmail设置>转发和POP/IMAP

当使用POP访问消息时,从下拉列表中
选择将Gmail的副本标记为已读并保存更改

Ok,再次查看代码后,我注意到您使用的是Folder.read\u WRITE,而我使用的是只读。我一改变主意,它就按预期工作了。Thankso没有办法让它的行为使消息不被标记为可见,除非显式标记为可见?我处理的是坏连接,有时在下载附件时连接会断开。由于.getcontent在发生这种情况时已经被调用,因此我需要确保它没有被标记为不可见。请注意,这种方法的开销是下载整个消息以使其标记为可见。
getcontent()
如果消息是MIME消息,则不会将其标记为已读,至少在我使用的IMAP中是这样。这不应该是公认的答案,请使用Shloim或James Vornhagen的答案。记住要测试所有可能的情况,因为每个IMAP实现都是不同的。这将在不下载整个消息的情况下完成。这只对我有用。只需要像这样切换到读写模式