【发布时间】:2014-05-01 22:33:29
【问题描述】:
IMAP spec 非常希望 UID 值可以用于此目的:
消息的唯一标识符在发送期间不得更改 会话,并且不应在会话之间更改。的任何变化 会话之间的唯一标识符必须可以使用 下面讨论 UIDVALIDITY 机制。
但是,唉,至少对于 Microsoft Exchange 服务器,我的经验表明,消息的 UID确实在会话之间偶尔/经常发生变化,即使它不应该,这是无法使用 UIDVALIDITY 检测到的(始终保持不变)。
作为实际可能发生的事情的一个例子。我对服务器说,有邮件吗?服务器说,当然,它们在这里,ID 为 4、5、7、8 和 11。(递增但不一定连续,到目前为止还不错。)
那么,下一次,我说,收到任何比 11 更新的邮件吗?服务器说确定,并给了我 14、15、16 和 18,但实际发生的情况是它重新分配了以前称为 e.g. 的消息的 ID。 5到例如16! 所以看起来像新邮件的东西,实际上是带有新 id 的旧邮件!
这意味着 1) “不应该”没有任何价值,2) 如果我们将“不应该”解释为“由您决定”,交易所实际上是在遵循规范,并且 3) 它可能违反了 UIDVALIDITY 规范部分(不太确定,因为规范有点模糊)。
这也意味着不能信任 UID 作为在服务器上识别消息的一种方式。如果我下载了消息 5,在数据库中存储了一些信息,而服务器在我不知情的情况下将其重命名为 16,我以后如何在服务器上找到它?我怎么知道 16 是我存储的 5 的副本?
知道不能使用 UID 的情况下,在服务器上识别邮件的可靠方法是什么?
【问题讨论】:
-
您确定查看的是 UID 而不是序列号?序列号可能会发生变化,并且通常是您从 mod 库中获得的,除非您特别要求提供 UID。另外,你确定服务器没有因为用户编辑消息而重新编号(这需要用新消息替换它)
-
绝对确定我使用的是 UID。我也看不到用户如何编辑收到的邮件(如果 Exchange 甚至允许这样做)。