我们必须使用IMAP接口开发一个消息存储库,该接口应该具有持久性UID功能,以便以后这些消息可以在多个设备(如移动设备,PC,笔记本电脑)之间同步,并且设备可以删除/复制消息。 RFC 3501提到UID在会话中是唯一的。
所以我的问题是:是否有任何IMAP RFC谈论邮箱的持久性UID?
答案 0 :(得分: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服务器中已存在的功能。
答案 1 :(得分:1)
RFC3501 强制要求是UID必须在会话中保持不变。这并不意味着它们不应该跨越会话 - 对于相反的情况,除非它们 持续存在,否则IMAP客户端将不得不一直下载它们。
我建议在这里多次重读RFC3501的相关部分 - 这是IMAP邮箱同步的关键部分,重要的是要做到这一点 - 包括与UIDVALIDITY
的关系和UIDNEXT
,以及CONDSTORE
和QRESYNC
扩展程序。
另请注意,对于如何分配UID以及新到达的消息必须的UID,有非常严格的保证。拥有每服务器唯一标识符不足。