【问题标题】:Reading emails from IMAP - how to flag them as SEEN when processed?从 IMAP 读取电子邮件 - 如何在处理时将其标记为已查看?
【发布时间】:2018-04-18 06:48:08
【问题描述】:

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

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

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

所以我尝试使用session.receiveEmail 接收它们,但不确定如何在处理时将它们标记为已读?任何提示如何做到这一点?我可以看到电子邮件对象具有我可以设置的“标志”属性,但不确定如何将此信息发送回服务器。

【问题讨论】:

  • 快速想法:1) 将电子邮件下载为未读 2) 处理后,只需再次下载电子邮件为 Seen?同时,将在 java mail api 中检查这是否可行。
  • 如果您解决了自己的问题,请将您的解决方案作为答案发布(并在超时后接受)。不要将解决方案添加到问题本身:这不是 Stack Overflow 应该如何工作的。

标签: java email jakarta-mail imap


【解决方案1】:

总结可能的解决方案:

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

  2. 您写的内容 - 使用 SessionFolder

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

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

结果是一样的。

【讨论】:

    【解决方案2】:

    已解决:我正在使用常见的 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);
    

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 2014-10-09
      • 1970-01-01
      • 2012-09-30
      • 2013-02-25
      • 2011-10-09
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多