如何将邮件从Gmail收件箱移动到标签?

时间:2011-11-26 11:10:05

标签: php gmail gmail-imap

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

$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);

不幸的是,当消息获得Processed标签时,它们仍然会留在收件箱中。

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

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

您必须将邮件“移动”到标签文件夹后将邮件移至“[Gmail] /所有邮件”文件夹,该标签文件夹不是Gmail看到的文件夹,只是让Gmail知道添加该标签

通过IMAP:

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

2)当邮件移至“[Gmail] /所有邮件”文件夹时,它会通知Gmail将其从收件箱中删除。

答案 2 :(得分: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);

答案 3 :(得分: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);
}

答案 4 :(得分:-2)

使用imap_expunge()imap_close (..., CL_EXPUNGE);,但如果使用true,请检查falseimap_close (..., CL_EXPUNGE);的返回值