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

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

不幸的是,虽然这些邮件会被标记为“已处理”,但它们仍然留在收件箱中。

我该如何将它们从收件箱中移除?


标签不是文件夹,无论它们在IMAP上如何表示。 - Ignacio Vazquez-Abrams
当然。你有解决方案吗? - Henno
那么你是在告诉我,使用IMAP和PHP绝对没有办法将邮件标记为“已处理”并从收件箱归档? - Henno
等一下... 那么 Thunderbird 是如何将 Gmail 收件箱中的邮件归档的呢? - Henno
5个回答

9
实际上...电子邮件被留在收件箱中的原因是,当imap_mail_move进行操作时,所有剩余消息的ID都会减少一个,因此当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);
    }
}

3
您需要将信息移动到“[Gmail]/全部邮件”文件夹中,在您将其“移动”到标签文件夹之后,该文件夹实际上并不是Gmail视为文件夹,只是让Gmail知道添加该标签。
所以通过IMAP:
1)当将邮件移动到“[Gmail]/标签”文件夹时,它会告诉Gmail将“标签”添加到邮件中,但不会对邮件进行任何移动。
2)当将邮件移动到“[Gmail]/全部邮件”文件夹中时,它会告诉Gmail将其从收件箱中删除。

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

0
将此代码放置于文件末尾,在处理完所有电子邮件后,该代码会将收件箱中的所有电子邮件移动到名为“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);
}

-2
使用 imap_expunge()imap_close(..., CL_EXPUNGE);,但在使用 imap_close(..., CL_EXPUNGE); 时请检查返回值是否为 truefalse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接