php-imap
php-imap copied to clipboard
Chuncked Message Loop
Describe the bug When the messages are getting by chunked function and one of this has problem the counter used in the function is wrong and the while condition looped
Code to Reproduce The troubling code section which produces the reported bug.
/** @var Webklex\PHPIMAP\ClientManager $cm */
$client_manager = new ClientManager($options = []);
/** @var \Webklex\PHPIMAP\Client $client */
$client = $client_manager->make([
'host' => "outlook.office365.com",
'port' => 993,
'encryption' => "ssl",
'validate_cert' => true,
'username' => "username",
'password' => "access_token",
'protocol' => 'imap',
'authentication' => "oauth"
]);
$client->connect();
if (!isset($client) || !$client->isConnected()) {
throw new \Exception("Cannot connect IMAP service");
}
$client->checkConnection();
/** @var Webklex\PHPIMAP\Folder $folder*/
$folder = $client->getFolderByName("INBOX");
/** @var string $date */
$date = (new DateTime())->sub(DateInterval::createFromDateString('1 day') )->format('d-m-Y');
$query = $folder->query()->setFetchBody(false)->setFetchFlags(false)->since( $date)->all();
/** @var \Webklex\PHPIMAP\Support\MessageCollection $messages */
$messages = $query->softFail()->chunked(
/**
* Chunk callback
* @param \Webklex\PHPIMAP\Support\MessageCollection $messages
* @param int $chunk
*/
function($messages, $chunk){
$messages->each(
/**
* Message callback
* @param \Webklex\PHPIMAP\Message $message
*/
function($message_fetch){
// do something
}
);
}
);
Expected behavior Chuncked function doesn't loop
Possibile solution
public function chunked(callable $callback, int $chunk_size = 10, int $start_chunk = 1) {
$available_messages = $this->search();
if (($available_messages_count = $available_messages->count()) > 0) {
$old_limit = $this->limit;
$old_page = $this->page;
$this->limit = $chunk_size;
$this->page = $start_chunk;
$handled_messages_count = 0;
do {
$messages = $this->populate($available_messages);
$handled_messages_count += $chunk_size;
$callback($messages, $this->page);
$this->page++;
} while ($handled_messages_count < $available_messages_count);
$this->limit = $old_limit;
$this->page = $old_page;
}
}
Desktop / Server (please complete the following information):
- OS: RockyLinux
- PHP: 8.0
- Version: 4.0.2
- Provider: Outlook