【问题标题】:How would I move a message from Gmail Inbox to a label?如何将邮件从 Gmail 收件箱移至标签?
【发布时间】:2011-11-26 11:10:04
【问题描述】:

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

$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 表示。
  • 当然。你有解决办法吗?
  • 所以你告诉我绝对没有办法将邮件标记为“已处理”并使用 IMAP 和 PHP 从收件箱中存档?
  • 等一下……Thunderbird 如何在 Gmail 收件箱中存档邮件?

标签: php gmail gmail-imap


【解决方案1】:

实际上... 邮件留在收件箱中的原因是,当 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);
    }
}

【讨论】:

    【解决方案2】:

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

    所以通过 IMAP:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-19
            • 2011-02-01
            相关资源
            最近更新 更多