【问题标题】:Why imap uid is not unique? on different folders?为什么 imap uid 不是唯一的?在不同的文件夹上?
【发布时间】:2014-06-11 11:57:19
【问题描述】:

我正在将我的邮箱元素保存到一个 mysql 数据库中(为了在我的 Intranet 中执行快速搜索,因为imap_search' 太慢了)。

我正在连接到服务器和文件夹,并遍历消息。

简化代码:

$numMsg = imap_num_msg($conn);

for($i=1;$i<=$numMsg;$i++){
    $uid = imap_uid($conn,$i);
    echo("msg_num:".$i." - uid:".$uid);
}

我得到这样的东西:

msg_num:5 - uid:5msg_num:6 - uid:6msg_num:7 - uid:7msg_num:8 - uid:8msg_num:9 - uid:9msg_num:10 - uid:10msg_num:11 - uid:11msg_num:12 - uid :12

这是完全错误的!!!

uid 不应该是唯一的吗?

我在我拥有的 5 个子文件夹和已发送邮件中获得了这个 UID,在收件箱中我得到了正确的 uid (msg_num:5 - uid:1503msg_num:6 - uid:1504msg_num:7 - uid:1506)

【问题讨论】:

标签: php imap


【解决方案1】:

是的,UID 仅在每个文件夹中是唯一的。消息的完整持久唯一 ID 是文件夹名称、文件夹 UIDVALIDITY 和消息 UID 的元组。在正确实现的服务器上,该元组只会引用一条消息。

例如: (发送, 1, 100) 表示来自已发送文件夹的第一个化身的 ID 为 100 的消息。 UIDVALIDITY 往往是大约 10 位数字,如果文件夹被删除并重新创建或需要由服务器软件重新索引/重新生成,则应该会更改。

【讨论】:

  • 谢谢 Max,我认为 UID 在所有邮箱中都是唯一的,我使用 UID 来查看电子邮件是否已经在 mysql DB 中,但现在我将检查其他值,现在检查是否电子邮件在数据库中比较 DATE、SUBJECT、FROM 地址和 TO 地址,而不仅仅是 UID。
  • 那还是很危险的。您应该包括文件夹名称和 UID 有效性作为您的额外密钥。那么它将是完全独一无二的。
  • 我不确定是否使用文件夹名称,因为电子邮件可能会更改文件夹并且仍然是同一电子邮件,或者不是?你所说的uid是指常规的uid吗?还是 UID 有效性是另一回事?
  • 不幸的是,IMAP 协议不允许您正常跟踪跨文件夹的电子邮件。当它移动文件夹时,它变成了一条全新的消息。它不保留其 UID。事实上,基线 IMAP 规范甚至没有 MOVE 命令。您必须将其复制到另一个文件夹(当然必须是新邮件),然后删除第一个。
  • 一个合理的设计是有一个文件夹表,跟踪文件夹名称及其 UIDVALIDITY,并带有自动生成的主键。然后将每条消息与这些文件夹之一相关联。如果您稍后连接并发现该文件夹不再存在或其 UIDVALIDITY 已更改,您将删除任何缓存消息的本地副本。但现在每条消息都由 folder_id 及其 UID 标识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
相关资源
最近更新 更多