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.