javamail将gmail邮件标记为已读
注:在回答后添加: 谢谢是的,我试过旗子。看到真的和保存更改。。我也读过它读过的getContent标记。我尝试在for语句中使用它来循环消息。但在下一个循环中,我还是从文件夹中得到了消息。我假设文件夹是活动的,所以抓取内容,然后用过滤器再次抓取文件夹中的消息以不被看到应该是可行的,但我仍然收到相同的消息。我可以尝试关闭文件夹,然后作为测试重新打开,看看它是否已标记。另外,如果我转到我的客户机并单击该消息,那么我的代码甚至在循环中也看不到它,所以我希望在代码中也这样做 原件: 我正在使用javamail从gmail帐户获取电子邮件,它工作得很好,当我收到我想标记为已读的邮件时,有人能给我一些指导吗?这是我目前的代码:javamail将gmail邮件标记为已读,java,jakarta-mail,Java,Jakarta Mail,注:在回答后添加: 谢谢是的,我试过旗子。看到真的和保存更改。。我也读过它读过的getContent标记。我尝试在for语句中使用它来循环消息。但在下一个循环中,我还是从文件夹中得到了消息。我假设文件夹是活动的,所以抓取内容,然后用过滤器再次抓取文件夹中的消息以不被看到应该是可行的,但我仍然收到相同的消息。我可以尝试关闭文件夹,然后作为测试重新打开,看看它是否已标记。另外,如果我转到我的客户机并单击该消息,那么我的代码甚至在循环中也看不到它,所以我希望在代码中也这样做 原件: 我正在使用java
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实现都是不同的。这将在不下载整个消息的情况下完成。这只对我有用。只需要像这样切换到读写模式