【问题标题】:Sync. emails using imap java同步。使用 imap java 的电子邮件
【发布时间】:2014-07-11 06:15:20
【问题描述】:

我已经编写了一个下载所有邮件并存储它们的代码,但现在我想同步邮件..也就是说,只下载那些之前未下载的邮件
注意:同步并不意味着只下载看不见的消息...
任何帮助或想法将不胜感激。

【问题讨论】:

  • 研究IMAP协议,IMAP有seen / unseen flags。您也可以在下载邮件或移至其他文件夹后删除邮件
  • 使用 UID,下载你以前没见过的 UIDS,移除服务器上不再存在的 UIDS,获取其他所有东西的标志。

标签: java email jakarta-mail imap sync


【解决方案1】:

为此,您可以使用消息 UID 来检查消息...最大 UID 是最近的消息...同步基本上包括两个部分:

  1. 获取数据库中不存在的新邮件。用于存储您上次下载的邮件的 UID(并且具有最大值)并将所有邮件从之前的最大 UID 值下载到新的 UID 值。
    2.从数据库中删除已删除的消息。为此检查缺少的 UID 的值并将其删除。
    虽然 UID 的值是特定于文件夹的,并且可能会因特定消息而更改,但现在很少发生,您可以通过 UIDvalidity 进行检查。
    如果您使用的是 java,则有称为 getUID()getUIDValidity()
    的函数 链接:http://docs.oracle.com/javaee/5/api/javax/mail/UIDFolder.html
    RFC4549 说明了需要如何进行同步。
    链接:https://www.rfc-editor.org/rfc/rfc4549

【讨论】:

    【解决方案2】:

    但现在我想同步邮件

    同步是指邮箱中的任何新邮件以及对现有邮件的修改。修改可以是更改标志甚至删除。

    如果您的 IMAP 存储支持 IDLE 命令,您可以对某个文件夹发出 IDLE 命令并监听该邮箱的任何更改。

    由于您无法对所有文件夹发出 IDLE 命令,因此您可以为文件夹维护 HIGHESTMODSEQ 和 LAST_UID 值(如果您的 IMAP 存储支持 CONDSTORE),并使用 uidfetchChangedSince在文件夹中查找自 LAST_UID 和 HIGHESTMODSEQ 以来的更改> 方法

    根据其文档,

       /**
         * Get the sequence numbers for messages changed since the given
         * modseq and with UIDs ranging from start till end.
         * Also, prefetch the flags for the returned messages.
         *
         * @param   start   first UID
         * @param   end last UID
         * @param   modseq  the MODSEQ
         * @return      array of sequence numbers
         * @exception   ProtocolException   for protocol failures
         * @see "RFC 4551"
         * @since   JavaMail 1.5.1
         */
        public int[] uidfetchChangedSince(long start, long end, long modseq)
                throws ProtocolException
    

    使用消息编号,您始终可以获得完整的消息。

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2018-04-08
      • 2019-05-26
      相关资源
      最近更新 更多