同步(复制)IMAP 消息
Posted
技术标签:
【中文标题】同步(复制)IMAP 消息【英文标题】:Synchronize (Replicate) IMAP Messages 【发布时间】:2012-05-28 04:17:04 【问题描述】:我有一个 imap 帐户(例如 some@gmail.com)并且我知道许多库,我可以通过这些库连接并将消息复制回我的目的地。我想实现以下目标,
-
第一次,我想下载所有消息(包括发送的文件夹),第一次下载时,我会将带有ID和UID的消息保存在本地的某个数据库中。
第二次,我不想查询已下载的邮件,即使它们的已读/未读状态或任何标志或已删除标志已更改或已清除。
我们的目标是在本地下载和同步每条消息,而且只有第一次。
现在我对 IMAP 消息知之甚少,他们有一个叫做 ID、UID 和 MessageID 的东西。 ID 可能是当前文件夹中的偏移量,UID 是当前帐户中的数字 id,MessageID 是唯一字符串。
现在我想知道,在查询文件夹时我应该使用什么搜索,以便下载后的消息不会返回给我。
我打算使用 http://mailsystem.codeplex.com/ 库,它提供了使用自定义字符串搜索并返回 int 数组的能力。
假设我有一个 MaxID,并且我只想下载 ID 或 UID 大于 MaxID 的消息。我应该使用哪一个? UID 还是 ID?
【问题讨论】:
【参考方案1】:您应该将 UID 与 UIDVALIDITY 结合使用。这两个值都是特定于文件夹的。
有一个信息 RFC 描述了 IMAP 客户端应如何进行同步(RFC-4549,第 4.3 节)。文中建议发出以下两条命令:
tag1 UID FETCH <lastseenuid+1>:* <descriptors>
tag2 UID FETCH 1:<lastseenuid> FLAGS
第一个命令用于获取所有未知邮件的所需信息(不知道有多少邮件)。第二个命令用于同步已看到邮件的标志。
AFAIK 这种方法被广泛使用。因此,许多 IMAP 服务器包含优化以快速提供此信息。通常,网络带宽是限制因素。
【讨论】:
假设两个文件夹,收件箱和垃圾邮件,其文件夹中的最大 UID 为 1000 和 100。现在,如果在两个同步时间之间,如果在垃圾邮件中收到 UID 为 101 的邮件并且用户将其移至收件箱,那么 UID 会发生什么?这条消息是否获得了 1001 的新 UID? IMAP 不支持移动操作,而是必须将电子邮件复制到目标文件夹并从源文件夹中删除。 UID 在一个文件夹中是唯一的,当一封电子邮件被附加或复制到一个文件夹时,该电子邮件获得的 UID 大于该文件夹中以前使用的所有 UID。 我还发现了关于搜索的信息,因为每天同步会更好吗?我想尽量减少服务器访问,为什么需要关注 UIDVALIDITY? 同步 IMAP 客户端的方法有很多,但我认为使用SEARCH SINCE
没有任何优势。关于 UIDVALIDITY,这很重要有几个原因:如果服务器必须重新编号电子邮件(例如由于 UID 溢出),它也会更改 UIDVALIDITY。如果删除一个文件夹并创建一个具有相同名称的新文件夹,则 UID 将从 1 重新开始。客户端检测更改的唯一方法是 UIDVALIDITY,这将是不同的。
能否请您阅读并就我的这个问题给我一些提示? ***.com/questions/10803558/…以上是关于同步(复制)IMAP 消息的主要内容,如果未能解决你的问题,请参考以下文章