PHP imap_mail_move: imap_header中要使用的正确ID是什么?


PHP imap_mail_move: what is the correct ID from imap_header to use?

这是imap_header转储…

$header = imap_header($mbox,$cms->page2);

stdClass Object ([date] => Tue, 11 june 2013 19:12:28 -0700[Date] => Tue, 11 june 2013 19:12:28 -0700[subject] => darnhippies.org论坛账户被锁定[主题]=> darnhippies.org论坛账户被锁定[message_id] => <201306120228.417bc449d097@www.darnhippies.org>[toaddress] => webmaster@example.com[to] =>数组([0] => stdClass对象([邮箱]=>网站管理员[host] => example.com)

    )
[fromaddress] => "darnhippies.org Forum" <webmaster@darnhippies.org>
[from] => Array
    (
        [0] => stdClass Object
            (
                [personal] => darnhippies.org Forum
                [mailbox] => webmaster
                [host] => darnhippies.org
            )
    )
[reply_toaddress] => "darnhippies.org Forum" <webmaster@darnhippies.org>
[reply_to] => Array
    (
        [0] => stdClass Object
            (
                [personal] => darnhippies.org Forum
                [mailbox] => webmaster
                [host] => darnhippies.org
            )
    )
[senderaddress] => "darnhippies.org Forum" <webmaster@darnhippies.org>
[sender] => Array
    (
        [0] => stdClass Object
            (
                [personal] => darnhippies.org Forum
                [mailbox] => webmaster
                [host] => darnhippies.org
            )
    )
[Recent] =>  
[Unseen] =>  
[Flagged] =>  
[Answered] =>  
[Deleted] =>  
[Draft] =>  
[Msgno] =>   22
[MailDate] => 11-Jun-2013 20:12:29 -0600
[Size] => 2008
[udate] => 1371003149

我一直试图通过使用$header->Msgno作为消息id来移动,我认为因为没有消息移动,所以这不是正确的id。

所以我使用(在这个例子中)$header->message_id作为消息移动的id吗?

我试过…

$result1 = imap_mail_move($mbox,'<201306120228.417bc449d097@www.darnhippies.org>','Inbox.Trash');
$result1 = imap_mail_move($mbox,'201306120228.417bc449d097@www.darnhippies.org','Inbox.Trash');
$result1 = imap_mail_move($mbox,'<201306120228.417bc449d097@www.darnhippies.org>','Inbox.Trash',CP_UID);
$result1 = imap_mail_move($mbox,'201306120228.417bc449d097@www.darnhippies.org','Inbox.Trash',CP_UID);
$result1 = imap_mail_move($mbox,'<201306120228.417bc449d097@www.darnhippies.org>','Inbox.Trash','CP_UID');
$result1 = imap_mail_move($mbox,'201306120228.417bc449d097@www.darnhippies.org','Inbox.Trash','CP_UID');

我也试过使用完整的收件箱名称,包括服务器地址,只是因为。

我得到以下错误大约90%的时间…

$boxes = imap_getmailboxes($mbox, "{mail.example.com}", "*");
print_r($boxes);

Error: Array ([0] => IMAP protocol error: error in IMAP command COPY: Invalid messageset[1] => IMAP命令出错


那么我如何找到正确的消息id?

什么是UID?

我知道我可以传递一个逗号分隔的id列表,我只是想先移动一个消息

John,您应该使用消息的UID来确保您引用的是正确的电子邮件。msgno是一个序列号,随着从邮箱中添加和删除电子邮件而更改。您可以使用以下命令(使用php imap库)在php中获得消息的UID:

$uid = imap_uid(*mailbox stream handle*, *msgno*);

生成的$uid在邮箱中永远是唯一的。

当您使用UID移动/读取/任何消息时,您需要在传递给相关函数的参数中添加一个选项,以表明您正在使用UID而不是msgno,例如:

$body = imap_fetchbody(*stream handle*, $uid, *mime-type*, FT_UID);

FT_UID是一个常量,它告诉imap库第二个参数是UID而不是msgno

关于imap库,php.net文档非常好,非常值得一读。

顺便说一下,如果发件人满足相关RFC的

,则message_id应该是全局所有电子邮件唯一的。

在IMAP中,每个消息都有两个标识符:消息序列号(我假设在PHP中是msgNo)和唯一ID (UID)。消息序列号可以随着消息的添加和从邮箱中删除而更改,但是UID在消息的生命周期内是永久的*。

您正在使用的字符串是来自电子邮件的消息id头的"消息id",它不能用于移动消息(首先,它不一定是唯一的)。如果您有UID,您应该能够使用带有UID修饰符标志的imap_mail_move来移动消息。

(我不熟悉PHP API,但也许您可以将UID修饰符标志传递给message_header以在结果集中也获得UID)

*:只要文件夹的UIDVALIDITY不改变,这在行为良好的服务器上是不应该的,只要文件夹没有被删除并以相同的名称重新创建