【问题标题】:Identifying mails between an IMAP server and a client application识别 IMAP 服务器和客户端应用程序之间的邮件
【发布时间】: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 甚至允许这样做)。

标签: email imap


【解决方案1】:

查看 message-id 标头字段可能是您最好的选择。

如果 Exchange 按您说的做,则违反规范:允许重新分配 UID,但如果这样做,则绝对必须更改 UIDVALIDITY。这是哪个特定版本/插件?

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

【讨论】:

  • 这是 Exchange 2010(带 SP)。但即使它在这种情况下确实改变了 UIDVALIDITY,它也不能真正解决问题,就像它在说“你不能信任旧的 UID,因为我改变了一些东西”,仍然没有办法如果他们的 UID 被重新分配,则识别旧邮件。而且我们已经知道我们不能真正信任会话之间的 UID...
  • 大多数客户端都认为 UID 是值得信赖的,所以我建议仔细查看重新分配 UID 的服务器。向微软询问。 (大多数客户端缓存消息,打开多个连接并假设 UID 是可移植的,甚至两者都做。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2017-03-15
  • 2021-10-22
相关资源
最近更新 更多