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


How would I move a message from Gmail Inbox to a label?

我试图将邮件从收件箱移到已处理的标签中,使用此代码:

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

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

我怎么让他们离开收件箱?

其实…电子邮件留在收件箱中的原因是,当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);
    }
}

你必须将邮件移动到"[Gmail]/All Mail"文件夹,在你将它"移动"到一个标签文件夹后,这并不是Gmail看到的真正的文件夹,只是让Gmail知道添加该标签。

所以通过IMAP:

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

2)当邮件被移动到"[Gmail]/所有邮件"文件夹时,它会告诉Gmail将其从收件箱中删除。

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

把这个放在你的文件的末尾,在你处理完所有的电子邮件后,这将移动所有在收件箱中找到的,并将它们移动到一个名为'done'的文件夹。

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

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