diff --git a/src/Connection/ImapQueryBuilder.php b/src/Connection/ImapQueryBuilder.php index 4fdc0e0..fd2db7f 100644 --- a/src/Connection/ImapQueryBuilder.php +++ b/src/Connection/ImapQueryBuilder.php @@ -270,6 +270,14 @@ public function header(string $header, string $value): static return $this->where(ImapSearchKey::Header->value." $header", $value); } + /** + * Add a where "HEADER Message-ID" clause to the query. + */ + public function messageId(string $messageId): static + { + return $this->header('Message-ID', trim(trim($messageId), '<>')); + } + /** * Add a where "UID" clause to the query. */ diff --git a/tests/Unit/Connection/ImapQueryBuilderTest.php b/tests/Unit/Connection/ImapQueryBuilderTest.php index 29edf1f..efad6fa 100644 --- a/tests/Unit/Connection/ImapQueryBuilderTest.php +++ b/tests/Unit/Connection/ImapQueryBuilderTest.php @@ -221,6 +221,17 @@ function (ImapQueryBuilder $q) { expect($builder->toImap())->toBe('FOO bar'); }); +test('compiles message id condition', function (string $messageId) { + $builder = new ImapQueryBuilder; + + $builder->messageId($messageId); + + expect($builder->toImap())->toBe('HEADER MESSAGE-ID "unique-message-id@server.example.com"'); +})->with([ + 'bare message id' => ['unique-message-id@server.example.com'], + 'wrapped message id' => [''], +]); + test('converts values from utf-8 to utf-7', function () { $builder = new ImapQueryBuilder; diff --git a/tests/Unit/MessageQueryTest.php b/tests/Unit/MessageQueryTest.php index 9f37bb4..4213c08 100644 --- a/tests/Unit/MessageQueryTest.php +++ b/tests/Unit/MessageQueryTest.php @@ -33,6 +33,13 @@ function query(?Mailbox $mailbox = null): MessageQuery expect($query)->toBe('SUBJECT "hello"'); }); +test('message id forwards to query builder', function () { + $query = query(); + + expect($query->messageId('unique-message-id@server.example.com'))->toBe($query); + expect($query->toImap())->toBe('HEADER MESSAGE-ID "unique-message-id@server.example.com"'); +}); + test('destroy', function () { $stream = new FakeStream; $stream->open();