如何使用PHP imap将电子邮件从一个文件夹移动到另一个文件夹

如何使用PHP imap将电子邮件从一个文件夹移动到另一个文件夹,php,imap,imap-open,Php,Imap,Imap Open,我正在尝试阅读电子邮件中的消息。。。根据主题的内容,我想将其移动到“进程”或“未经授权”文件夹 将邮件保存在数组中,然后将邮件从收件箱移动到文件夹中 这就是我所做的 // Checks the inbox if ($messages = imap_search($this->conn,'ALL')) { // Sorts the messages newest first rsort($messages); // Loops through the messages

我正在尝试阅读电子邮件中的消息。。。根据主题的内容,我想将其移动到“进程”或“未经授权”文件夹

将邮件保存在数组中,然后将邮件从收件箱移动到文件夹中

这就是我所做的

// Checks the inbox
if ($messages = imap_search($this->conn,'ALL'))
{
    // Sorts the messages newest first
    rsort($messages);
    // Loops through the messages
    foreach ($messages as $id)
    {
        $header = imap_headerinfo($this->conn, $id);
        $message = imap_fetchbody($this->conn, $id, 1);

        if(    !isset($header->from[0]->mailbox) || empty($header->from[0]->mailbox)
            || !isset($header->from[0]->host) || empty($header->from[0]->host)
            || !isset($header->subject) || empty($header->from[0]->host)
        ) {
            continue;
        }

        $from = $header->from[0]->mailbox . '@' . $header->from[0]->host;
        $subject = $header->subject;    

        $outlook = $this->_parseReplyExchange($message);

        if($outlook !== false){
            $newReply = $outlook;
        } else {
            $newReply = $this->_parseReplySystem($message);
        }

        $ticketID = $this->_parseTicketID($subject);
        if($ticketID !== false){
            $f = array();
            $f['id'] = $id;
            $f['from'] = $from;
            $f['subject'] = $subject;
            $f['ticketID'] = $ticketID;
            $f['message'] = $newReply;
            $this->replyList[] = $f;

            $imapresult = imap_mail_move($this->conn, $id, $box, CP_UID);

            if($imapresult == false){
                echo imap_last_error();
            }
        }
    }
}
else
{
    exit('No messages on the IMAP server.');
}
我阅读邮件时没有任何问题,但在尝试移动邮件时,我收到了一个错误

.[TRYCREATE] The requested item could not be found.
Notice: Unknown: [TRYCREATE] The requested item could not be found. (errflg=2) in Unknown on line 0
我认为问题在于如何将$id传递给
imap\u mail\u move
函数

我还尝试将消息sequance number转换为UID号,如so
$f['id']=imap\u UID($this->conn,$id)
,但没有成功

我也试过这个

$imapresult = imap_mail_move($this->conn, '1:' . $id, $box);
$imapresult = imap_mail_move($this->conn, '1:' . $id, $box, CP_UID);
我甚至试着复制然后删除这条消息,但没有成功

$imapresult = imap_mail_copy($c, '1', 'INBOX/Processed', CP_MOVE);
我无法让信息移动

如何正确移动邮件?

我发现了问题

问题是,
已处理的
文件夹不是收件箱文件夹的子文件夹。这是收件箱旁边的文件夹设置

这里的要点是在使用函数时,您需要传递一个序列号或一系列序列号

$imapresult = imap_mail_move($this->conn, $id, $box);
收到的每条消息都有一个序列号
1,2,3,n
,其中n是在给定框中收到的最新消息

下面是
$id
变量的示例

1
1:5
1,2,5,6,7
第一个示例表示将邮件1从当前文件夹移动到
$box
中定义的新文件夹

第二个示例意味着将邮件1、2、3、4、5从当前文件夹移动到
$box
中定义的新文件夹

第三个示例表示将消息1、2、5、6、7从当前文件夹移动到
$box
中定义的新文件夹

此外,下面是$box变量的一些示例

'INBOX/Processed'
'Unauthorized'
第一个示例表示位于收件箱文件夹下的
已处理的
文件夹

第二个示例表示位于收件箱文件夹“相同位置”旁边的
未经授权的
文件夹

要知道每个文件夹在电子邮件中的位置,您可以使用函数


我希望这能帮助其他人,因为我花了一段时间才发现这个愚蠢的问题

您正在混合序列ID和UID。为什么要将CP\u UID标志传递给imap\u mail\u move?@Max我尝试使用将序列号转换为UID,但这也不起作用
imap\u UID($this->conn,$id)
似乎我应该传递一个范围,但我不确定如何生成该范围?我希望一次移动一封邮件,因为在某些情况下,邮件会移动到其他文件夹