我正在尝试使用以下代码将邮件从收件箱转移到已处理的标签:
$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标签时,它们仍然会留在收件箱中。
我如何让他们离开收件箱?
答案 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
,请检查false
或imap_close (..., CL_EXPUNGE);
的返回值