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

时间:2013-05-01 14:36:11

标签: php email hash uniqueidentifier pop3

IMAP消息有UID我们都欢欣鼓舞。但是,我正在试图找出如何为POP3消息生成唯一ID并遇到问题(像hotmail.com这样的旧系统只允许使用POP3)。

  

POP会话打开时,修复了客户端的可用消息   maildrop,由本地的消息号标识   会话,或者可选地,通过分配给消息的唯一标识符   由POP服务器。此唯一标识符是永久且唯一的   maildrop并允许客户端访问相同的消息   不同的POP会话。检索邮件并标记为删除   消息号。当客户端退出会话时,标记为的邮件   删除从maildrop中删除。 - wikipedia

然而,似乎基本的LIST命令只返回一个临时数字数组,以便您获取电子邮件。这些数字绝不是唯一的,但似乎已经添加了另一个名为UIDL的扩展:CAPA(POP3扩展机制)。

POP3表示只要邮件存在,UIDL就是唯一的。

  

消息的唯一ID是服务器确定的任意字符串,   由0x21到0x7E范围内的1到70个字符组成,其中   唯一标识maildrop中的消息并持续存在   跨会话。即使会话结束,也需要此持久性   没有进入UPDATE状态。服务器永远不应该重用   在给定的maildrop中的unique-id,只要实体使用   unique-id存在。

     

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

     

虽然通常最好存储服务器实现   在maildrop中任意分配了unique-id,这个规范是   旨在允许将unique-id计算为哈希值   信息。客户应该能够处理两种情况   maildrop中相同的消息副本具有相同的唯一ID。

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

我应该对整个邮件正文进行哈希并将其用作ID吗?

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

MDaemon program似乎解决了部分标头哈希的问题:

  

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

我有机会同时收到来自同一个人的同一个主题和相同消息ID的两封不同的电子邮件。

当然,这并非不可能。它们可能不会生成消息ID,它们可能有一个空白的主题行,它们可能有一个损坏的时钟,并且它们可能同时具有所有这些内容。但话说回来,他们的电子邮件通过的路由器可能会被来自太空的巨型流星消灭。

坦率地说,最有可能的情况是电子邮件最终会被垃圾邮件检测到,我也绝不会看到它。电子邮件只是不太可靠的一种沟通形式。你需要一些运行得相当好的东西,但如果它不能处理百万个边缘情况中的那个,你可能仍然可以。

答案 1 :(得分:1)

对不起质疑你的问题,但是 - 真正的问题是:你为什么关心?在我看来,你正在努力想出一个电子邮件的自然主键。无论如何,你不应该 - 而且根本就没有。你想要解决的真正问题是什么?

您对UIDL的理解是正确的。一条消息在特定邮箱中必须保持相同的UIDL,相同的消息可以具有相同的UIDL(但不需要),并且UIDL 不应在邮箱的上下文中重复,但是并非严格要求。最后一项要求特别强调了UIDL的范围和目的。一旦客户端从邮箱中删除了一条消息,它就必须(并且可以)忘记它的UIDL,因为如果再次出现该值,它将永远不会传达与前一条消息的任何关系。

答案 2 :(得分:0)

我会将您提到的UIDL与当前时间戳一起散列,以确保数字的唯一性。如果UIDL是唯一的,只要消息离开,使用时间戳将确保您引用的方案(具有相同UIDL的另一条消息)不会发生!