为POP3电子邮件创建唯一ID的常规方法是什么?

Xeo*_*oss 6 php email hash pop3 uniqueidentifier

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个字符组成,它唯一地标识maildrop中的消息并且在会话中持续存在.即使会话结束而未进入UPDATE状态,也需要此持久性.只要存在使用unique-id的实体,服务器就不应该在给定的maildrop中重用唯一ID.

请注意,未列出标记为已删除的邮件.

虽然服务器实现通常优选在maildrop中存储任意分配的唯一ID,但此规范旨在允许将unique-id计算为消息的散列.客户端应该能够处理maildrop中两个相同的消息副本具有相同唯一ID的情况.

这让我觉得我可能会在一年后(在删除第一个消息之后)下载另一条消息,该消息具有相同的UIDL并且可能在我的系统中发生冲突.

我应该只是散列整个邮件正文并将其用作ID吗?

我可能只是TOP [id] 1用来散列不应与现有电子邮件匹配的标题(和第一行),而不是取出整个电子邮件,因为接收服务器总是会添加某种类型的信息吗?因此,攻击者永远不会导致冲突,因为收到的或者某些东西应该被修改好了吗?

MDaemon的方案似乎解决与局部头部散列问题:

MDaemon使用消息名称,日期戳,大小以及有关消息的一些其他详细信息构造UIDL结果.因此,如果在服务器上修改了邮件,即使您不重命名邮件,它也会对邮件客户端显示为"新邮件".

为POP3电子邮件制作ID的正确方法是什么?

注意:电子邮件通常包含Message-ID标题 - 但我不能依赖它,因为它可以用作攻击媒介来混淆我的系统.它也被一些电子邮件客户端遗漏了.

Jam*_*ess 3

就我个人而言,我只会对电子邮件标头的一小部分进行哈希处理:例如DateFromSubjectMessage-ID如果可用。

我经常订阅邮件列表,当有人回复您时,您往往会收到同一消息的多个副本 - 一份直接来自他们,另一份通过邮件服务器。在这种情况下,许多标头都是不同的,但我真的不想收到邮件的两份副本。

我同时收到同一个人发来的两封具有相同主题和相同消息 ID 的不同电子邮件的可能性似乎极小。

当然,这也不是不可能。他们可能不会生成消息 ID,他们可能有一个空白的主题行,他们可能有一个坏了的时钟,他们可能同时拥有所有这些东西。但话又说回来,他们的电子邮件所通过的路由器可能会被来自太空的巨大流星摧毁。

坦率地说,最有可能的情况是电子邮件最终会被垃圾邮件检测到,而且我永远不会看到它。电子邮件并不是一种可靠的通信方式。您需要一些工作得相当好的东西,但如果它不能处理百万分之一的边缘情况,您可能仍然没问题。