clientFactory = $clientFactory; } /** * @return int[] * @throws ServiceException */ public function findMatches(Account $account, Mailbox $mailbox, SearchQuery $searchQuery): array { $client = $this->clientFactory->getClient($account); try { $fetchResult = $client->search( $mailbox->getName(), $this->convertMailQueryToHordeQuery($searchQuery) ); } catch (Horde_Imap_Client_Exception $e) { throw new ServiceException('Could not get message IDs: ' . $e->getMessage(), 0, $e); } finally { $client->logout(); } return $fetchResult['match']->ids; } /** * @param SearchQuery $searchQuery * * @todo possible optimization: filter flags here as well as it might speed up IMAP search * * @return Horde_Imap_Client_Search_Query */ private function convertMailQueryToHordeQuery(SearchQuery $searchQuery): Horde_Imap_Client_Search_Query { return array_reduce( $searchQuery->getBodies(), static function (Horde_Imap_Client_Search_Query $query, string $textToken) { $query->text($textToken, true); return $query; }, new Horde_Imap_Client_Search_Query() ); } }