在PHP中使用IMAP获取唯一的电子邮件ID

时间:2013-02-15 12:19:49

标签: php imap

如何为IMAP帐户中的每封电子邮件计算唯一ID字符串?

我正在创建一个脚本,该脚本必须经常将所有丢失的邮件从一个IMAP帐户复制到另一个帐户。我想避免在每次更新时都重复,因此我必须确定一个帐户上的内容以及另一个帐户中的内容。

并非所有电子邮件都有message_id,我看不出message_iduid之间有什么区别 - 有人可以告诉我吗?

在我看来,使用imap_appendmessage_id没有改变 - 有人可以确认吗?

为每封电子邮件生成唯一的ID字符串时,除了消息ID,fx电子邮件标题和日期之外还有许多其他选项,但我不知道该选择什么: http://www.php.net/manual/en/function.imap-headerinfo.php

2 个答案:

答案 0 :(得分:10)

UID在邮箱中是唯一的,但不会在邮箱之间映射,因此在邮箱之间匹配电子邮件是没有用的。

message_id旨在为所有电子邮件全局唯一,并由发送电子邮件服务器生成。如果服务器配置正确,则它发送的每条消息都将包含message_id,这可用于匹配邮箱之间的电子邮件。但是,配置错误的服务器可能无法分配message_id。在这种情况下,senderaddress&的散列。 udate一直被证明对我来说是独一无二的 - 如果电子邮件来自同一个人在相同的微秒,它将是相同的信息。注意 - 使用发件人而不是from - from比发件人更容易被欺骗。

答案 1 :(得分:2)

根据我的说法,可以按如下方式生成唯一ID:

  

密钥:邮件的纪元时间(来自日期字段)

但同时用户可以收到多封邮件。

  

密钥:邮件的纪元时间+ MailSize

在特定时间,收件人ID可以接收相同大小的不同邮件

  

KEY:邮件的纪元时间+ MailSize +接收服务器IP(可以从收到的:字段中获取)

在特定时间,收件人ID也可以从同一个ip收到相同大小的不同邮件。

  

密钥:邮件的纪元时间+ MailSize +接收服务器IP(可以从收到的:字段获得)+ md5sum邮件。

此密钥重复的可能性非常低。

消息ID通常是发送消息的设备的标识符,或者可能是其他内容,完全取决于域,对于不同的邮件可能相同,并且可能完全不存在。

uid是imap服务器跟踪邮件身份的东西。但是如果在邮件被删除或移动之间以及有错误的服务器代码,可能会为不同的邮件分配相同的uid。