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

Php 为POP3电子邮件创建唯一ID的正常方法是什么?,php,email,hash,uniqueidentifier,pop3,Php,Email,Hash,Uniqueidentifier,Pop3,IMAP消息有一个UID,我们都为此感到高兴。然而,我试图找出如何为POP3消息生成唯一ID,但遇到了问题(像hotmail.com这样的旧系统只允许POP3) 当POP会话打开时,发送给客户端的可用消息是固定的 邮件投递,并由该邮件的本地邮件号标识 会话,或者(可选)通过分配给消息的唯一标识符 通过POP服务器。此唯一标识符是永久性的,并且是唯一的 邮件投递,并允许客户端访问中的同一邮件 不同的流行音乐。通过检索邮件并将其标记为删除 留言号码。当客户端退出会话时,标记为 删除将从邮件投递中删除

IMAP消息有一个
UID
,我们都为此感到高兴。然而,我试图找出如何为POP3消息生成唯一ID,但遇到了问题(像hotmail.com这样的旧系统只允许POP3)

当POP会话打开时,发送给客户端的可用消息是固定的 邮件投递,并由该邮件的本地邮件号标识 会话,或者(可选)通过分配给消息的唯一标识符 通过POP服务器。此唯一标识符是永久性的,并且是唯一的 邮件投递,并允许客户端访问中的同一邮件 不同的流行音乐。通过检索邮件并将其标记为删除 留言号码。当客户端退出会话时,标记为 删除将从邮件投递中删除。-

然而,basic
LIST
命令似乎只是返回一个临时数字数组,以允许您获取电子邮件。这些数字并不是唯一的,尽管似乎添加了另一个名为UIDL的扩展:(POP3扩展机制)

声明只要消息存在,
UIDL
就是唯一的

消息的唯一id是由服务器确定的任意字符串, 由0x21到0x7E范围内的一到70个字符组成,其中 在邮件投递中唯一标识一条消息,该消息将持续存在 跨会话。即使会话结束,也需要这种持久性 没有进入更新状态。服务器不应重复使用 给定邮件投递中的唯一id,只要使用 存在唯一id

请注意,标记为已删除的邮件不会列出

而服务器实现通常更倾向于存储 邮件投递中任意分配的唯一ID,此规范为 旨在允许将唯一ID作为 消息客户应该能够处理两个 邮件投递中邮件的相同副本具有相同的唯一id

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

我应该散列整个消息体并将其用作ID吗

与其提取整个电子邮件进行散列,也许我应该使用
TOP[id]1
对标题(和第一行)进行散列,因为接收服务器总是会添加一些类型的信息,所以标题(和第一行)永远不会与现有的电子邮件相匹配?因此,攻击者永远不会导致冲突,因为收到的或应该修改的内容是正确的

似乎解决了部分头哈希问题:

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

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


注:电子邮件通常包含一个代码>消息ID >代码>标题,但我不能依赖它,因为它可以用作一个攻击向量来混淆我的系统。一些电子邮件客户也忽略了这一点。

请原谅我问你的问题,但是–真正的问题是:你为什么在意?在我看来,你真的很努力地想为电子邮件找到一个自然的主键。你不应该这样做——而且实际上也没有。你想解决的真正问题是什么


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

就我个人而言,我只会散列邮件标题的一小部分:类似于
Date
from
主题
,以及
消息ID
(如果可用)

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

而我收到两封不同的电子邮件的机会,从同一个人在同一时间,相同的主题和相同的消息id似乎是极不可能的

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


坦率地说,最有可能的情况是,电子邮件最终会被垃圾邮件检测到,我无论如何也不会看到它。电子邮件并不是一种可靠的交流方式。你需要一些工作相当好的东西,但是如果它不能处理百万分之一的情况,你可能仍然可以

我会将您提到的UIDL与当前时间戳一起散列,您应该确保数字的唯一性。如果消息离开时UIDL是唯一的,那么使用时间戳将确保您引用的场景(具有相同UIDL的另一条消息)不会发生

似乎连电子邮件也不总是唯一的。我想防止在我的客户端中出现重复的邮件,因为它将处理邮件进行存储,同一封电子邮件可能存在于多个文件夹中,或者在POP列表中出现多次。显然地