mapper = $mapper; $this->logger = $logger; } /** * Add a new email addresses * * Duplicates are ignored * * @param string $userId * @param AddressList $addressList * * @return void */ public function addAddresses(string $userId, AddressList $addressList): void { $this->logger->debug('collecting ' . count($addressList) . ' email addresses'); foreach ($addressList->iterate() as $address) { /* @var $address Address */ $this->saveAddress($userId, $address); } } /** * @param string $userId * @param Address $address * * @return void */ private function saveAddress(string $userId, Address $address): void { try { $hordeAddress = $address->toHorde(); if (!$hordeAddress->valid) { throw new Horde_Mail_Exception(); } } catch (Horde_Mail_Exception $ex) { // Ignore it $this->logger->debug('<' . $address->getEmail() . '> is not a valid RFC822 mail address'); return; } if ($address->getEmail() !== null && $this->mapper->insertIfNew($userId, $address->getEmail(), $address->getLabel())) { $this->logger->debug("saved new address <{$address->getEmail()}>"); } } /** * Find and return all known and matching email addresses * * @param string $term * @return CollectedAddress[] */ public function searchAddress(string $userId, string $term): array { $this->logger->debug("searching for collected address <$term>"); $result = $this->mapper->findMatching($userId, $term); $this->logger->debug('found ' . count($result) . ' matches in collected addresses'); return $result; } }