7

我正在尝试使用以下代码将邮件从收件箱移到已处理标签中:

$inbox = imap_open($host,$user,$pass) or die('Error: ' . imap_last_error());

if( $emails = imap_search($inbox,'ALL') )
{
    foreach($emails as $email_number) {
        imap_mail_move($inbox, $email_number, 'Processed') or die('Error');
    }

}
imap_expunge($inbox);
imap_close($inbox);

不幸的是,虽然邮件获得了已处理标签,但它们仍然留在收件箱中。

我如何让他们远离收件箱?

4

5 回答 5

9

实际上... 邮件留在收件箱中的原因是,当 imap_mail_move 执行此操作时,所有剩余邮件的 ID 都减 1,因此当 foreach 循环移动到下一封邮件时,留下了一封邮件. 这会跳过每次迭代都会重复的消息。这就是为什么 imap_mail_move 似乎不起作用的原因。

解决方案是使用唯一的消息 UID,而不是可能重复的 ID:

$inbox  = imap_open( $host, $user, $pass );
$emails = imap_search( $inbox, 'ALL', SE_UID );

if( $emails ) {
    foreach( $emails as $email_uid ) {
        imap_mail_move($inbox, $email_uid, 'processed', CP_UID);
    }
}
于 2011-12-06T15:58:58.897 回答
3

您必须将邮件移动到“[Gmail]/All Mail”文件夹,然后将其“移动”到标签文件夹,该文件夹并不是 Gmail 所看到的真正文件夹,只是让 Gmail 知道添加该标签。

所以通过IMAP:

1) 当邮件移动到“[Gmail]/TAG”文件夹时,它会告诉 Gmail 将“TAG”添加到邮件中,但不会对邮件进行任何形式的移动。

2) 当邮件移动到“[Gmail]/All Mail”文件夹时,它会告诉 Gmail 将其从收件箱中删除。

于 2011-11-30T22:52:15.777 回答
1

@Henno,您的诊断是正确的,但您可以简单地按降序对电子邮件进行排序。

$inbox = imap_open($host,$user,$pass) or die('Error: ' . imap_last_error());

if( $emails = imap_search($inbox,'ALL') )
{
    arsort($emails); //JUST DO ARSORT
    foreach($emails as $email_number) {
        imap_mail_move($inbox, $email_number, 'Processed') or die('Error');
    }

}
imap_expunge($inbox);
imap_close($inbox);
于 2012-05-03T09:18:00.317 回答
0

将其放在文件的末尾,在您处理完任何电子邮件后,这将移动收件箱中的所有内容,并将它们移动到名为“完成”的文件夹中。

$mbox   = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'emailaddress@gmail.com', 'password');
$countnum = imap_num_msg($mbox);
if($countnum > 0) {
//move the email to our saved folder
$imapresult=imap_mail_move($mbox,'1:'.$countnum,'done');
if($imapresult==false){die(imap_last_error());}
imap_close($mbox,CL_EXPUNGE);
}
于 2014-02-12T16:19:06.110 回答
-2

使用imap_expunge()orimap_close (..., CL_EXPUNGE);但检查返回值 if trueor falseif usingimap_close (..., CL_EXPUNGE);

于 2017-05-09T15:47:26.463 回答