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

时间:2018-01-09 07:51:21

标签: javamail imap uid

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

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

我很遗憾“只是”发现邮件服务器可能会对其中的一些邮件或其所有邮件重新编号,因此重新编号会使我以前在数据库中保留的所有UIDS无效。

我不明白我应该采取什么行动来克服这种行为,这种重新编号,我可以做些什么来拦截这种重新编号,我该怎么做才能重新编号我的信息,是他们的一部分还是全部?

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

我在想:

  1. 对于邮件服务器中的每封邮件
  2. 在我的数据库中搜索,与其主题,日期和消息ID匹配
  3. 如果找到,请使用新的UID更新db中的消息
  4. 祝你好运

2 个答案:

答案 0 :(得分:1)

通常UIDVALIDITY不应更改。如果是,则应该对该文件夹进行完全重新同步(删除所有内容并从零同步)。

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

答案 1 :(得分:1)

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

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

Courier和Dovecot维护人员为标准化DIGEST扩展来计算单个消息的加密哈希值做了一些努力。这些正是您正在寻找的。但是,我认为这些都没有标准化。另外,请记住,MIME标准允许任何给定消息的几个等效表示(想想各种8位编码方案)。一旦MIME结构发生变化,任何正文摘要都会中断。

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