imap_setflag_full 无法更改邮件状态

imap_setflag_full not working to change mail status

我正在使用下面的代码阅读我的 Gmail 收件箱,它的阅读效果很好。

但问题是有些邮件设置不正确,所以每次都会收到。

根据我的观察,没有将标志从看不见变为看见的邮件是其中包含一些 HTML 的邮件。

下面是我的代码:

 public function getMessages($type = 'text') {
        $stream = $this->imapStream;
        $emails = imap_search($stream, 'UNSEEN');
        $messages = array();
        if ($emails) {
            $this->emails = $emails;
            $i = 0;
            foreach ($emails as $email_number) {
                $this->attachments = array();
                $uid = imap_uid($stream, $email_number);
                $messages[] = $this->loadMessage($uid, $type);
                if ($i == $this->limit) {
                    break;
                }
                $i++;
                echo "seen status=>".imap_setflag_full($stream, $email_number, "\Seen", ST_UID);
                //echo "seen status=>".imap_clearflag_full($stream, $email_number, "\Seen");
            }
        }
        return $messages;
    }

这是我用来手动更改状态的行

echo "seen status=>".imap_setflag_full($stream, $email_number, "\Seen", ST_UID);

结果总是 return 1,但在收件箱中显示为未读。

您正在使用消息序列号 (MSN),但向您的标志函数提供 ST_UID 标志,将它们更改为使用 UID。大多数 MSN 通常不是有效的 UID。

要么到处使用 UID(对所有函数使用 FT_UIDST_UID 等),要么到处使用 MSN(永远不要使用 UID 标志,并且在循环时不要删除任何东西。)

imap_setflag_full($stream, $email_number, "\Seen");

imap_setflag_full($stream, $uid, "\Seen", ST_UID);

如果使用 UID 版本的搜索,则不需要调用 imap_uid