我编写的代码下载所有邮件并存储,但现在我想同步邮件 ..即仅下载那些之前没有下载过的邮件。
注意:同步并不意味着只下载看不见的消息...
任何帮助或想法将不胜感激。
答案 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
使用消息编号,您始终可以获得完整的消息。