Email 识别IMAP服务器和客户端应用程序之间的邮件

Email 识别IMAP服务器和客户端应用程序之间的邮件,email,imap,Email,Imap,对于UID值可用于以下用途,人们寄予厚望: 消息的唯一标识符在发送过程中不得更改 会话,并且不应在会话之间更改。有什么变化吗 会话之间的唯一标识符必须使用 UID有效性机制如下所述 但遗憾的是,至少对于Microsoft Exchange server而言,我的经验表明,邮件的UID在会话之间偶尔/经常会更改,即使它不应该更改,而且使用UIDVality(始终保持不变)无法检测到这一点 作为实际可能发生的事情的一个例子。我对服务器说,收到邮件了吗?服务器说,当然,它们在这里,ID为4、5、7、8

对于UID值可用于以下用途,人们寄予厚望:

消息的唯一标识符在发送过程中不得更改 会话,并且不应在会话之间更改。有什么变化吗 会话之间的唯一标识符必须使用 UID有效性机制如下所述

但遗憾的是,至少对于Microsoft Exchange server而言,我的经验表明,邮件的UID在会话之间偶尔/经常会更改,即使它不应该更改,而且使用UIDVality(始终保持不变)无法检测到这一点

作为实际可能发生的事情的一个例子。我对服务器说,收到邮件了吗?服务器说,当然,它们在这里,ID为4、5、7、8和11。(增加,但不一定是连续的,到目前为止还不错。)

那么,下次,我说,收到比11号更新的邮件了吗?服务器说肯定,然后给我14、15、16和18,但实际发生的是,它已将消息的id(以前称为e.g.5)重新分配给e.g.16!所以看起来像是一封新邮件,实际上是一封带有新id的旧邮件

这意味着1)“不应该”没有任何价值,2)如果我们将“不应该”解释为“由您决定”,则Exchange实际上遵循规范,3)它可能违反UIDVality部分的规范(不太确定,因为规范有点模糊)

这也意味着UID不能作为识别服务器上消息的一种方式。如果我下载了消息5,在数据库中存储了一些信息,服务器在我不知道的情况下将其重命名为16,我以后如何在服务器上找到它?我怎么知道16是我存储的5的副本呢


在知道无法使用UID的情况下,识别服务器上邮件的可靠方法是什么?查看邮件id标题字段可能是最好的选择

如果Exchange按照您所说的那样做,那么它违反了规范:允许它重新分配UID,但如果它这样做,它绝对必须更改UID的有效性。这是哪个特定版本/插件


(编辑:我听说Exchange这样做时总是增加UID,这不是违反规范的行为。分配一个新的较低的UID是完全不可以的,但只要Exchange总是增加UID,它实际上就没有违反规范。不过我确实觉得这种行为有点臭。)

你确定你在看UID而不是序列号吗?序列号可能会发生变化,除非您特别要求UID,否则通常是您从mod库中获得的序列号。另外,您确定服务器没有因为用户编辑邮件而对邮件重新编号(这需要将其替换为新邮件)绝对确定我使用UID。我也看不到用户会如何编辑收到的邮件(如果Exchange允许的话)。这是Exchange 2010(带SPs)。但是,即使在这种情况下它确实改变了UID的有效性,它也不能真正解决问题,就像它说的那样,“你不能相信旧的UID,因为我改变了一些东西”,如果它们的UID被重新分配,仍然无法识别旧的消息。我们已经知道,我们不能在会话之间真正信任UID……大多数客户端都认为UID是可信的,所以我建议仔细查看重新分配UID的服务器。问问微软。(大多数客户端缓存消息,打开多个连接,并假设UID是可移植的,甚至两者都可以。)