在 IMAP 中移动电子邮件后获取新 ID
Getting the new ID after moving an email in IMAP
我正在使用 PHP 中的 IMAP 功能来处理我的电子邮件并将它们导入数据库。导入后,我将每封电子邮件移动到不同的文件夹以将它们分开。
public function moveMail($mailId, $mailBox) {
return imap_mail_move($this->getImapStream(), $mailId, $mailBox, CP_UID) && $this->expungeDeletedMails();
}
移动它们后,我确定电子邮件是否相关。如果不是,我想将其移至第二个文件夹。但是,移动后,内部邮件ID被更改,所以我无法再移动电子邮件。
我正在寻找一种方法来获取已移动电子邮件的 ID,以便我可以再次移动它。
有什么想法吗?
找了一段时间发现在PHP的imap库中没有找到新的uid
的解决方法。我想知道我是否可以只获取最后一个 uid 并将其递增 1,但是由于可能会收到一封新电子邮件,这也行不通。
我最好的解决方案可能是使用 UIDPLUS
IMAP 扩展并参考 APPENDUID
响应代码。
结论
我最后的结论是,如果上述扩展名不可用并且您的邮件服务器不支持 SEARCH HEADER
,则根本不可能通过其 Message-id
找到邮件,为此不可能知道我的新电子邮件分配的 ID。
文档告诉 UID 不应更改:http://php.net/manual/en/function.imap-uid.php
(这不是 PHP 具体的,不会直接回答您的问题)
这通常有两种方法:
1) UIDPLUS
扩展,如果支持,应该在 OK 响应中给出 COPYUID
响应。这包括复制邮件时新文件夹中的 UIDVALIDITY
和新 UID。
2) 当此操作失败时,打开一个新连接或切换到目标文件夹,并为 Message-ID header 执行 UID SEARCH
。如果你得到一个单一的回应,那可能就是你的信息。如果您收到多个回复,最高的可能是您的消息(假设多个客户端没有在大约同一时间复制具有相同 Message-ID 的消息。)因为 Message-ID 是发件人发送 header,并且不一定是唯一的(消息可以重复),这是不完美的,但大多数时候会给出合理的结果。缺点是速度慢。
幸运的是,几乎所有服务器都支持 UIDPLUS。不幸的是,PHP 库可能没有。
我正在使用 PHP 中的 IMAP 功能来处理我的电子邮件并将它们导入数据库。导入后,我将每封电子邮件移动到不同的文件夹以将它们分开。
public function moveMail($mailId, $mailBox) {
return imap_mail_move($this->getImapStream(), $mailId, $mailBox, CP_UID) && $this->expungeDeletedMails();
}
移动它们后,我确定电子邮件是否相关。如果不是,我想将其移至第二个文件夹。但是,移动后,内部邮件ID被更改,所以我无法再移动电子邮件。
我正在寻找一种方法来获取已移动电子邮件的 ID,以便我可以再次移动它。
有什么想法吗?
找了一段时间发现在PHP的imap库中没有找到新的uid
的解决方法。我想知道我是否可以只获取最后一个 uid 并将其递增 1,但是由于可能会收到一封新电子邮件,这也行不通。
我最好的解决方案可能是使用 UIDPLUS
IMAP 扩展并参考 APPENDUID
响应代码。
结论
我最后的结论是,如果上述扩展名不可用并且您的邮件服务器不支持 SEARCH HEADER
,则根本不可能通过其 Message-id
找到邮件,为此不可能知道我的新电子邮件分配的 ID。
文档告诉 UID 不应更改:http://php.net/manual/en/function.imap-uid.php
(这不是 PHP 具体的,不会直接回答您的问题)
这通常有两种方法:
1) UIDPLUS
扩展,如果支持,应该在 OK 响应中给出 COPYUID
响应。这包括复制邮件时新文件夹中的 UIDVALIDITY
和新 UID。
2) 当此操作失败时,打开一个新连接或切换到目标文件夹,并为 Message-ID header 执行 UID SEARCH
。如果你得到一个单一的回应,那可能就是你的信息。如果您收到多个回复,最高的可能是您的消息(假设多个客户端没有在大约同一时间复制具有相同 Message-ID 的消息。)因为 Message-ID 是发件人发送 header,并且不一定是唯一的(消息可以重复),这是不完美的,但大多数时候会给出合理的结果。缺点是速度慢。
幸运的是,几乎所有服务器都支持 UIDPLUS。不幸的是,PHP 库可能没有。