【问题标题】:Getting the new ID after moving an email in IMAP在 IMAP 中移动电子邮件后获取新 ID
【发布时间】:2016-09-30 20:12:13
【问题描述】:

我正在使用 PHP 中的 IMAP 函数来处理我的电子邮件并将它们导入数据库。导入后,我将每封电子邮件移至不同的文件夹以保持分开。

public function moveMail($mailId, $mailBox) {
    return imap_mail_move($this->getImapStream(), $mailId, $mailBox, CP_UID) && $this->expungeDeletedMails();
}

移动它们后,我确定电子邮件是否相关。如果不是,我想将其移至第二个文件夹。但是,移动它后,内部邮件ID已更改,因此我无法再移动电子邮件。

我正在寻找一种方法来获取已移动电子邮件的 ID,以便再次移动它。

有什么想法吗?

【问题讨论】:

  • 您可以为这些电子邮件添加自定义标题吗?
  • 不,这只是我从别人那里收到的电子邮件。

标签: php email imap


【解决方案1】:

搜索了一会发现在PHP的imap库中没有解决办法获取新的uid。我想知道我是否可以只获取最后一个 uid 并将其增加一个,但由于可能会收到一封新电子邮件,所以这也行不通。

我最好的解决方案可能是使用UIDPLUS IMAP 扩展并查阅APPENDUID 响应代码。

结论

我的最终结论是,如果上述扩展不可用并且您的邮件服务器不支持SEARCH HEADER,则根本不可能通过其Message-id 找到邮件,因此不可能知道什么ID 我的新电子邮件已分配。

【讨论】:

【解决方案2】:

文档告诉 UID 不应更改:http://php.net/manual/en/function.imap-uid.php

【讨论】:

  • 如果移动到另一个文件夹,UID 会发生变化,因为就 IMAP 而言,它是一条新消息。
【解决方案3】:

(这不是 PHP 特定的,不直接回答您的问题)

这通常有两种方法:

1) UIDPLUS 扩展,如果支持,应该在 OK 响应中给出 COPYUID 响应。这包括复制邮件时新文件夹中的 UIDVALIDITY 和新 UID。

2) 当此操作失败时,打开新连接或切换到目标文件夹,并为 Message-ID 标头执行UID SEARCH。如果你得到一个单一的回应,那可能就是你的信息。如果您收到多个响应,则最高的可能是您的消息(假设多个客户端不会在大约同一时间复制具有相同 Message-ID 的消息。)因为 Message-ID 是发件人发送的标头,并且不一定是唯一的(消息可以重复),这是不完美的,但大多数时候给出合理的结果。缺点是速度慢。

幸运的是,几乎所有服务器都支持 UIDPLUS。不幸的是,PHP 库可能没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2010-11-07
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多