如何正确处理以前会话中电子邮件 uid 的更改?

How to properly handle the changing of email uids over previous sessions?

我有一个简单的服务器,用于侦听来自一个或多个文件夹以及一个或多个邮箱的传入电子邮件。

下载的消息(除正文和附件外的所有消息)都保存在数据库中,因此即使是它们的 UID,每次客户需要时都可以通过 UID 引用它们来检索它们。

不幸的是,我 "just" 发现邮件服务器可能会对它们的部分或所有邮件重新编号,因此重新编号会使我之前保存在数据库中的所有 UIDS 失效。

我不明白我应该采取什么行动来克服这种行为,这种重新编号,我可以做些什么来拦截这种重新编号以及我可以做些什么来重新编号我的邮件,其中一部分还是全部?

我已经了解 UIDValidity 机制,但我不明白当我发现它的变化时到底做了什么。

我想:

  1. 对于邮件服务器中的每封邮件
  2. 在我的数据库中搜索它,与它的主题、日期和消息 ID 进行匹配
  3. 如果找到,用新的 UID 更新数据库中的消息

此致

一般来说UIDVALIDITY不应该改变。如果是这样,您应该对该文件夹进行完全重新同步(删除所有内容并从零开始同步)。

如果确实发生了变化,这可能意味着它实际上是一个不同的文件夹。例如,删除一个文件夹并将另一个文件夹重命名为旧文件夹的名称。或删除该文件夹或重新创建一个具有相同名称的新文件夹。同名,不同文件夹,不同UIDVALIDITY.

你真的无能为力。一旦 IMAP 服务器告诉您 UIDVALIDITY 已更改,那么唯一符合标准、可靠且安全的操作就是丢弃本地缓存中的所有内容。

有一些非标准扩展可能对您有所帮助。例如,GMail 有自己的 X-GM-MSGID,但它没有指定这些是否会在 UIDVALIDITY 更改时失效。

Courier 和 Dovecot 的维护者做出了一些努力来标准化 DIGEST 用于计算单个消息的加密哈希的扩展。这些正是您要寻找的。但是,我认为这些从未标准化过。此外,请记住 MIME 标准允许对任何给定消息使用多个等效表示(考虑各种 8 位编码方案)。一旦 MIME 结构发生变化,任何正文摘要都会中断。

如果我是你,我不会尝试使用 Message-Id。它的值是用户控制的。