简体   繁体   中英

Iterate only unseen messages in IMAP with Laminas Mail

We can count unseen messages with:

$unreadMessages = $mail->countMessages([Storage::FLAG_UNSEEN]);

How to iterate only those unseen messages? When I iterate all messages (as shown in documentation ), it's painfully slow.

foreach ($mail as $messageNum => $message) {
        if ($message->hasFlag(Storage::FLAG_SEEN) && !$message->hasFlag(Storage::FLAG_UNSEEN) && !$message->hasFlag(Storage::FLAG_RECENT)) {
            // echo PHP_EOL . PHP_EOL . "Skipping seen/not-recent e-mail from " . $message->from . PHP_EOL;
            continue;
        }
}

Thanks.

When you look into how countMessages() function is done, you find out that protocol search function can be used. But protocol is private. So you have to extend the class:

class MyImap extends Laminas\Mail\Storage\Imap
{
    public function getProtocol()
    {
        return $this->protocol;
    }
}

$mail = new MyImap(...);

Then you can use this for fast iterating only unseen messages:

$message_nums = $mail->getProtocol()->search(['UNSEEN']);
foreach ($message_nums as $messageNum) {
        $message = $mail->getMessage($messageNum);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM