【发布时间】: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 中有很多不同的电子邮件服务器可供使用,还有很多电子邮件地址,但没有我控制的服务器。