【问题标题】:What is the right way to track last email message?跟踪最后一封电子邮件的正确方法是什么?
【发布时间】:2026-02-08 23:00:02
【问题描述】:

我需要为跨某些 IMAP 服务器的电子邮件消息编写解析器。它作为 cron 任务运行并将结果存储在数据库中。

我需要一种方法,只获取之前运行尚未解析的消息。

有一个现有的数据库架构建议实施者应该使用 UID 来跟踪一个特定邮箱的“新”消息。我想知道它是否正确......

我看到的是RFC3501 表示 UID、UIDVALIDITY 和邮箱名称都可以在不同的情况下发生变化。

更具体地说,UID 可能会在会话之间发生变化,如果 UIDVALIDITY 发生变化,您可以判断它是否发生了变化。

因此,我无法将带有 UIDVALIDITY 的 UID 存储在数据库中以获取消息,并确保这对数字在以后的运行中不会毫无意义。

RFC3501 还说:

邮箱中的唯一标识符必须始终严格按升序排列。

所以让我们假设 UIDVALIDITY 发生了变化。为邮箱重新生成所有 UID。

这是否意味着最后一条消息的先前 UID 1000 将严格高于 1000?还是只是意味着旧消息的 UID 必须低于新消息的 UID,并且与以前的 UID 无关?

此外,如果我要绑定到 Message-ID 而不是 UID。我发现RFC-2822 说 Message-ID 应该存在于消息中,这意味着根本没有 Message-ID。

那么我如何跟踪我已经分析过的消息以及解析器运行之间的“新”消息?

【问题讨论】:

  • 你可能读得太多了。 UIDVALIDITY 可以改变,但通常不会。如果是这样,这意味着你应该扔掉你的缓存。
  • 其次,如果您的目标是处理每条传入的消息一次,最好将自己插入 SMTP 接收路径,而不是 IMAP。
  • @Max,谢谢,你能提示一下 SMTP 接收路径是什么吗? RFC 部分?
  • 它将是特定于服务器的。大多数 SMTP 服务器软件允许您在接收时运行脚本。例如,这就是 spamassassin 的工作方式。但是,如果您使用的是 Gmail 等,则不会有此选项,因为您无法控制服务器。
  • @Max 哦,我明白了。我在 DB 中有很多不同的电子邮件服务器可供使用,还有很多电子邮件地址,但没有我控制的服务器。

标签: email imap


【解决方案1】:

当邮箱重命名或删除时,UIDVALIDITY 会发生变化。 幸运的是,Gmail、Yahoo、Microsoft Exchange 等邮件服务器只允许重命名或删除用户创建的邮箱。所以在我看来,通过这种方法,收件箱、已发送、删除中的 UID 始终是唯一的。

【讨论】:

    最近更新 更多