Skip to content

Chuncked Message Loop #308

Open
Open
@jack-2729

Description

@jack-2729

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions