2

所以这里是一个imap_header垃圾场...

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

stdClass 对象([日期] => 2013 年 6 月 11 日星期二 19:12:28 -0700 [日期] => 2013 年 6 月 11 日星期二 19:12:28 -0700 [主题] => darnhippies.org 上的帐户论坛被锁定[主题] => darnhippies.org 论坛上的帐户被锁定 [message_id] => <201306120228.417bc449d097@www.darnhippies.org> [toaddress] => webmaster@example.com [to] => Array ([0] => stdClass 对象([邮箱] => 网站管理员 [主机] => 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] => IMAP 协议错误:IMAP 命令复制错误:消息集无效 [1] => IMAP 命令复制错误:消息集无效)


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

什么是 UID?

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

4

2 回答 2

1

约翰,您应该使用邮件UID来确保您引用了正确的电子邮件。msgno 是一个序列号,它随着电子邮件的添加和从邮箱中删除而改变。您会在 php 中收到一条消息UID(使用 php imap 库),其中包含:

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

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

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

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

FT_UID是一个常数,它告诉 imap 库第二个参数是UIDnot msgno

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

顺便说一句,如果发件人符合相关的 RFC,message_id 对于全球所有电子邮件都应该是唯一的

于 2013-10-14T15:58:06.730 回答
0

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

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

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

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

于 2013-06-18T17:13:18.417 回答