【发布时间】:2013-08-29 18:19:16
【问题描述】:
我们必须使用 IMAP 接口开发消息存储,该接口应具有持久 UID 的功能,以便以后可以在多个设备(如移动设备、PC、笔记本电脑)之间同步这些消息,并且设备可以删除/复制消息. RFC 3501 提到 UID 在会话中是唯一的。
所以我的问题是:是否有任何 IMAP RFC 谈论邮箱的持久 UID?
【问题讨论】:
-
IMAP 有什么问题?您可能会希望与它兼容。
我们必须使用 IMAP 接口开发消息存储,该接口应具有持久 UID 的功能,以便以后可以在多个设备(如移动设备、PC、笔记本电脑)之间同步这些消息,并且设备可以删除/复制消息. RFC 3501 提到 UID 在会话中是唯一的。
所以我的问题是:是否有任何 IMAP RFC 谈论邮箱的持久 UID?
【问题讨论】:
每个 IMAP 消息都被分配了一个特定于 用户 的 UID,因为两个用户可能会收到两条不同的消息,但会被分配相同的 UID。 [aka UID != UUID] 如果您的软件发出一个简单的FETCH 1:* (FLAGS),服务器将响应一个按顺序编号的列表忽略消息的 UID。任何要专门处理消息 UID 的命令,都必须确保正确发出它,如 FETCH UID 1:* (FLAGS)。
例如:
a1 fetch 1:* (flags)
* 1 FETCH (FLAGS (\Seen))
* 2 FETCH (FLAGS (\Seen))
* 3 FETCH (FLAGS (\Seen))
* 4 FETCH (FLAGS (\Seen))
* 5 FETCH (FLAGS (\Answered \Seen))
* 6 FETCH (FLAGS (\Seen))
* 7 FETCH (FLAGS (\Seen))
* 8 FETCH (FLAGS (\Seen))
* 9 FETCH (FLAGS (\Seen))
* 10 FETCH (FLAGS (\Seen))
对比:
a8 uid fetch 1:* (flags)
* 1 FETCH (UID 1 FLAGS (\Seen))
* 2 FETCH (UID 2 FLAGS (\Seen))
* 3 FETCH (UID 3 FLAGS (\Seen))
* 4 FETCH (UID 4 FLAGS (\Seen))
* 5 FETCH (UID 5 FLAGS (\Answered \Seen))
* 6 FETCH (UID 6 FLAGS (\Seen))
* 7 FETCH (UID 8 FLAGS (\Seen))
* 8 FETCH (UID 9 FLAGS (\Seen))
* 9 FETCH (UID 10 FLAGS (\Seen))
* 10 FETCH (UID 11 FLAGS (\Seen))
也就是说,我不明白您为什么需要单独跟踪 UID 以跨多个设备进行同步。只要每个设备都从 IMAP 服务器收集其信息,它们就会默认同步。您实际上是在重新实现任何 IMAP 服务器中已经存在的功能。
【讨论】:
Unique Identifier (UID) 和 Message Sequence Number。所以序列号在每个邮箱 1,2,3,4... 中,并且 UID 在系统范围内是唯一的。两者都是整数,但不是 UUID。 UUID 包含 A-F0-9 和 '-'。
RFC3501 要求的是 UID 在会话中必须保持不变。这并不意味着它们不应该在会话间保持持久——相反,除非它们是持久的,否则 IMAP 客户端将不得不一直下载它们。
我建议在这里重新阅读 RFC3501 的相关部分——这是 IMAP 邮箱同步的关键部分,正确处理这一点很重要——包括与 UIDVALIDITY 和 @987654322 的关系@,以及 CONDSTORE 和 QRESYNC 扩展。
另外请记住,对于如何分配 UID 以及新到达消息的 UID必须是什么样子,有非常严格的保证。拥有每个服务器的唯一标识符不够。
【讨论】: