同步。使用imap java的电子邮件

时间:2014-05-22 09:32:38

标签: java email javamail imap sync

我编写的代码下载所有邮件并存储,但现在我想同步邮件 ..即仅下载那些之前没有下载过的邮件
注意:同步并不意味着只下载看不见的消息...
任何帮助或想法将不胜感激。

2 个答案:

答案 0 :(得分:4)

为此您可以使用消息UID来检查消息...最近的消息是最近的消息...同步基本上包括两部分:
1. 获取新消息,这在数据库中不存在。对于该存储您上次下载的消息的UID(并具有最大值),并将所有邮件从先前的最大UID值下载到新的UID值。
2. 从数据库中删除已删除的邮件。为此,请检查缺少的UID的值并将其删除。
虽然UID的值是特定于文件夹的,并且可能会针对特定消息进行更改,但现在很少发生,您可以通过UIDvalidity进行检查。
如果您使用的是java,则会出现名为 getUID() getUIDValidity()的函数 链接:http://docs.oracle.com/javaee/5/api/javax/mail/UIDFolder.html
RFC4549说明了如何进行同步 链接:http://tools.ietf.org/html/rfc4549

答案 1 :(得分:1)

  

但现在我要同步邮件

同步意味着邮箱中的所有新邮件以及对现有邮件的修改。修改可以是更改标记甚至删除。

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

由于您无法在所有文件夹上发出IDLE命令,因此您可以为文件夹维护HIGHESTMODSEQ和LAST_UID值(如果您的IMAP Store支持CONDSTORE),并使用 uidfetchChangedSince 方法

从其文件中

   /**
     * 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

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