IMAP 消息有一个UID
我们都为之高兴的。但是,我试图弄清楚如何为 POP3 邮件生成唯一 ID,但遇到了麻烦(hotmail.com 等旧系统只允许 POP3)。
当 POP 会话打开 maildrop 时,发送给客户端的可用消息是固定的,并由该会话本地的消息号标识,或者可选地,由 POP 服务器分配给消息的唯一标识符标识。这个唯一标识符对于 maildrop 是永久且唯一的,它允许客户端在不同的 POP 会话中访问相同的消息。邮件由消息号检索并标记为删除。当客户端退出会话时,标记为删除的邮件将从 maildrop 中删除。-维基百科
然而,基本LIST
命令似乎只是返回一个临时数字数组以允许您获取电子邮件。这些数字绝不是唯一的,因此似乎添加了另一个名为 UIDL 的扩展:CAPA(POP3 扩展机制)。
POP3声明,UIDL
只要消息存在,a 就是唯一的。
消息的唯一 ID 是由服务器确定的任意字符串,由 0x21 到 0x7E 范围内的 1 到 70 个字符组成,它唯一地标识了邮件投递中的消息,并且在会话中持续存在。即使会话结束而没有进入 UPDATE 状态,也需要这种持久性。只要存在使用唯一 ID 的实体,服务器就不应在给定的邮件投递中重用唯一 ID。
请注意,标记为已删除的邮件未列出。
虽然服务器实现通常最好将任意分配的唯一 ID 存储在邮件投递中,但本规范旨在允许将唯一 ID 计算为消息的哈希值。客户端应该能够处理邮件投递中消息的两个相同副本具有相同唯一 ID 的情况。
这让我认为一年后我可能会下载另一条消息(在第一条消息被删除之后),它具有相同的 UIDL 并且可能在我的系统中发生冲突。
我是否应该对整个消息正文进行哈希处理并将其用作 ID?
而不是获取整个电子邮件来散列它,也许我应该只使用TOP [id] 1
散列不应该与现有电子邮件匹配的标题(和第一行),因为接收服务器总是会正确添加某种类型的信息?所以攻击者永远不会引起冲突,因为收到的东西应该已经被修改了,对吧?
MDaemon 程序似乎解决了部分标头散列的问题:
MDaemon 使用消息名称、日期戳、大小和有关消息的一些其他详细信息来构造 UIDL 结果。因此,如果邮件在服务器上被修改,即使您不重命名它,它也会对邮件客户端显示为“新”。
为 POP3 电子邮件创建 ID 的正确方法是什么?
注意:电子邮件通常包含Message-ID
标题 - 但我不能依赖它,因为它可能被用作攻击媒介来混淆我的系统。一些电子邮件客户端也忽略了它。