0

我们必须使用 IMAP 接口开发消息存储,该接口应该具有持久 UID 的功能,以便以后可以在多个设备(如移动设备、PC、笔记本电脑)之间同步这些消息,并且设备可以删除/复制消息。RFC 3501 提到 UID 在会话中是唯一的。

所以我的问题是:是否有任何 IMAP RFC 谈论邮箱的持久 UID?

4

2 回答 2

2

每个 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 服务器中已经存在的功能。

于 2013-08-29T18:51:29.467 回答
1

RFC3501要求UID 在会话中必须保持不变。这并不意味着它们不应该在会话间保持持久——相反,除非它们持久的,否则 IMAP 客户端将不得不一直下载它们。

我建议在这里重新阅读 RFC3501 的相关部分——这是 IMAP 邮箱同步的关键部分,正确处理这一点很重要——包括与UIDVALIDITYand的关系UIDNEXT,以及CONDSTOREandQRESYNC扩展名。

另外请记住,对于如何分配 UID 以及新到达消息的 UID必须是什么样子,有非常严格的保证。拥有每个服务器的唯一标识符是不够的。

于 2013-09-02T11:50:47.217 回答