我有一个简单的服务器,它侦听来自一个或多个文件夹以及一个或多个邮箱的传入电子邮件。
下载的邮件(除了它们的正文和附件之外的几乎所有邮件)都保留在数据库中,因此即使是它们的 UID 和它们也可以在客户端每次需要时通过其 UID 引用来检索它们。
不幸的是,我"刚刚"发现邮件服务器可能会重新编号部分或全部邮件,因此重新编号会使我以前保留在数据库中的所有 UIDS 无效。
我不明白我应该采取什么措施来克服这种行为,这种重新编号,我能做些什么来拦截这种重新编号,以及我能做些什么来重新编号我的消息,其中的一部分还是全部?
我已经了解了UIDValidity机制,但是当我发现它的变化时,我不明白到底该怎么做。
我在想:
- 对于邮件服务器中的每封邮件
- 在我的数据库中搜索它,与其主题、日期和消息 ID 匹配
- 如果找到,请使用其新的 UID 更新数据库中的消息
此致敬意
你真的什么都做不了。一旦 IMAP 服务器告诉您UIDVALIDITY
已更改,那么唯一符合标准、可靠和安全的操作就是丢弃本地缓存中的所有内容。
有一些非标准扩展可能会对您有所帮助。例如,GMail有自己的X-GM-MSGID
,但它没有具体说明这些是否在UIDVALIDITY
更改时失效。
Courier 和 Dovecot 维护者做出了一些努力,以标准化用于计算单个消息的加密哈希的DIGEST
扩展。这些正是您正在寻找的。但是,我认为这些从未标准化过。另外,请记住,MIME 标准允许任何给定消息的多个等效表示形式(想想各种 8 位编码方案)。一旦MIME结构发生变化,任何身体消化都会中断。
如果我是你,我不会尝试使用Message-Id
。其值由用户控制。
一般来说,UIDVALIDITY
不应该改变。 如果是这样,您应该对该文件夹进行完全重新同步(删除所有内容并从零开始同步)。
如果它确实发生了变化,这可能意味着它实际上是一个不同的文件夹。 例如,删除文件夹并将其他文件夹重命名为旧文件夹的名称。 或者删除文件夹或重新创建具有相同名称的新文件夹。 相同的名称,不同的文件夹,不同的UIDVALIDITY
。