如何为IMAP帐户中的每封电子邮件计算唯一ID字符串?
我正在创建一个脚本,该脚本必须经常将所有丢失的邮件从一个IMAP帐户复制到另一个帐户。我想避免在每次更新时都重复,因此我必须确定一个帐户上的内容以及另一个帐户中的内容。
并非所有电子邮件都有message_id
,我看不出message_id
和uid
之间有什么区别 - 有人可以告诉我吗?
在我看来,使用imap_append时message_id
没有改变 - 有人可以确认吗?
为每封电子邮件生成唯一的ID字符串时,除了消息ID,fx电子邮件标题和日期之外还有许多其他选项,但我不知道该选择什么: http://www.php.net/manual/en/function.imap-headerinfo.php
答案 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。