从IMAP阅读电子邮件 - 如何在处理时将它们标记为SEEN?

时间:2018-04-18 06:48:09

标签: java email javamail imap

我正在使用JODD邮件库阅读和处理从IMAP收到的电子邮件。 API非常好,但我遇到了一个逻辑问题。我使用的代码如下:

EmailFilter filter= new EmailFilter();
filter.flag(Flags.Flag.SEEN, false);
session.receiveEmailAndMarkSeen(filter);

通过致电session.receiveEmailAndMarkSeen我收到所有未读电子邮件,这些电子邮件会立即标记为已读。现在,由于任何原因我的代码处理失败,并且我再次尝试接收电子邮件,所有这些未处理的电子邮件都已标记为已读并且不再下载。我宁愿下载电子邮件并将其标记为单独阅读,因为已成功处理。

所以我尝试使用session.receiveEmail接收它们但不确定如何在处理时将它们标记为已读?有什么提示怎么办?我可以看到电子邮件对象有标记'属性我可以设置,但不知道如何将此信息发送回服务器。

2 个答案:

答案 0 :(得分:0)

总结可能的解决方案:

  1. 使用Seen标记重新获取电子邮件。缺点是再次提取电子邮件。

  2. 您撰写的内容 - 使用SessionFolder

  3. 最后 - 从Jodd的下一个版本开始,你将拥有方法updateEmailFlags,它可以让你选择只调用它:

    mymail.flags(newFlags); ReceiveMailSession.updateEmailFlags(mymail);

  4. 结果将是相同的。

答案 1 :(得分:0)

已解决:我正在使用常见的JAVA邮件类 - 会话和存储创建连接。

Session sess = Session.getDefaultInstance(props, null);
Store store = sess.getStore("imaps");
store.connect("imapServerHost", "username","password");

...然后我创建文件夹对象(指向收件箱)

Folder folder = store.getFolder(this.imapFolder);
folder.open(Folder.READ_WRITE);

...然后我会收到使用会话和商店的电子邮件

ReceiveMailSession session=new ReceiveMailSession(sess, store);

...在处理完电子邮件后,我使用文件夹对象发回SEEN = true消息。

Flags f=new Flags();
f.add(Flags.Flag.SEEN);
folder.setFlags(new int[] {email.getMessageNumber()}, f,true);