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

时间:2013-06-18 04:35:50

标签: php imap

所以这是一个imap_header转储......

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

stdClass对象(       [date] =>星期二,2013年6月11日19:12:28 -0700       [日期] =>星期二,2013年6月11日19:12:28 -0700       [subject] =>帐户darnhippies.org论坛被锁定       [主题] =>帐户darnhippies.org论坛被锁定       [message_id] => < 201306120228.417bc449d097@www.darnhippies.org>       [toaddress] => webmaster@example.com       [to] =>排列           (               [0] => stdClass对象                   (                       [mailbox] =>网站管理员                       [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);
  

错误:数组(       [0] =&gt; IMAP协议错误:IMAP命令出错COPY:无效的消息集       [1] =&gt; IMAP命令出错COPY:无效的消息集)


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

什么是UID?

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

2 个答案:

答案 0 :(得分:1)

John,您应该使用邮件UID来确保您引用了正确的电子邮件。 msgno是一个序列号,随着在邮箱中添加和删除电子邮件而更改。你在php(使用php imap库)中得到一条消息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应该是唯一的

答案 1 :(得分:0)

在IMAP中,每条消息都有两个标识符:消息序列号(我假设它是PHP中的msgNo)和唯一ID(UID)。在邮箱中添加和删除邮件时,邮件序列号可能会更改,但UID在邮件生命周期内是永久性的。

您使用的字符串是来自电子邮件的Message-Id标头的“Message-Id”,不能用于移动邮件(例如,它不一定是唯一的)。如果你有UID,你应该可以使用带有UID修饰符标志的imap_mail_move来移动消息。

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

*:只要文件夹的UIDVALIDITY没有改变,只要该文件夹没有被删除并且使用相同的名称重新创建,它就不应该更改。