mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-27 07:00:29 +01:00
126 lines
3.8 KiB
PHP
126 lines
3.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Xentral\Modules\SystemMailClient;
|
|
|
|
use Xentral\Components\MailClient\Client\MailClientInterface;
|
|
use Xentral\Components\MailClient\MailClientFactory;
|
|
use Xentral\Modules\SystemMailClient\Exception\EmailAccountNotFoundException;
|
|
use Xentral\Modules\SystemMailClient\Exception\MailClientConfigException;
|
|
use Xentral\Modules\SystemMailClient\Exception\OAuthException;
|
|
use Xentral\Modules\SystemMailer\Data\EmailBackupAccount;
|
|
use Xentral\Modules\SystemMailer\Exception\EmailBackupAccountException;
|
|
use Xentral\Modules\SystemMailer\Service\EmailAccountGateway;
|
|
|
|
final class MailClientProvider implements MailClientProviderInterface
|
|
{
|
|
/** @var MailClientFactory */
|
|
private $factory;
|
|
|
|
/** @var MailClientConfigProvider */
|
|
private $configProvider;
|
|
|
|
/** @var EmailAccountGateway $accountGateway */
|
|
private $accountGateway;
|
|
|
|
/**
|
|
* @param MailClientFactory $factory
|
|
* @param MailClientConfigProvider $configProvider
|
|
* @param EmailAccountGateway $accountGateway
|
|
*/
|
|
public function __construct(
|
|
MailClientFactory $factory,
|
|
MailClientConfigProvider $configProvider,
|
|
EmailAccountGateway $accountGateway
|
|
) {
|
|
$this->factory = $factory;
|
|
$this->configProvider = $configProvider;
|
|
$this->accountGateway = $accountGateway;
|
|
}
|
|
|
|
/**
|
|
* @param int $userId
|
|
*
|
|
* @throws EmailAccountNotFoundException
|
|
* @throws MailClientConfigException
|
|
* @throws OAuthException
|
|
*
|
|
* @return MailClientInterface
|
|
*/
|
|
public function createMailClientByUserId(int $userId): MailClientInterface
|
|
{
|
|
try {
|
|
$account = $this->accountGateway->getAccountByUser($userId);
|
|
} catch (EmailBackupAccountException $e) {
|
|
throw new EmailAccountNotFoundException($e->getMessage(), $e->getCode(), $e);
|
|
}
|
|
|
|
return $this->createMailClientFromAccount($account);
|
|
}
|
|
|
|
/**
|
|
* @param int $addressId
|
|
*
|
|
* @throws EmailAccountNotFoundException
|
|
* @throws MailClientConfigException
|
|
* @throws OAuthException
|
|
*
|
|
* @return MailClientInterface
|
|
*/
|
|
public function createMailClientByAddressId(int $addressId): MailClientInterface
|
|
{
|
|
try {
|
|
$account = $this->accountGateway->getAccountByAddress($addressId);
|
|
} catch (EmailBackupAccountException $e) {
|
|
throw new EmailAccountNotFoundException($e->getMessage(), $e->getCode(), $e);
|
|
}
|
|
|
|
return $this->createMailClientFromAccount($account);
|
|
}
|
|
|
|
/**
|
|
* @param string $emailAddress
|
|
*
|
|
* @throws EmailAccountNotFoundException
|
|
* @throws MailClientConfigException
|
|
* @throws OAuthException
|
|
*
|
|
* @return MailClientInterface
|
|
*/
|
|
public function createMailClientByEmail(string $emailAddress): MailClientInterface
|
|
{
|
|
try {
|
|
$account = $this->accountGateway->getAccountByEmail($emailAddress);
|
|
} catch (EmailBackupAccountException $e) {
|
|
throw new EmailAccountNotFoundException($e->getMessage(), $e->getCode(), $e);
|
|
}
|
|
|
|
return $this->createMailClientFromAccount($account);
|
|
}
|
|
|
|
/**
|
|
* @param EmailBackupAccount $account
|
|
*
|
|
* @throws OAuthException
|
|
* @throws MailClientConfigException
|
|
*
|
|
* @return MailClientInterface
|
|
*/
|
|
public function createMailClientFromAccount(EmailBackupAccount $account): MailClientInterface
|
|
{
|
|
switch ($account->getImapType()) {
|
|
case 1:
|
|
// NO BREAK
|
|
case 3:
|
|
// NO BREAK
|
|
case 5:
|
|
$config = $this->configProvider->createImapConfigFromAccount($account);
|
|
|
|
return $this->factory->createImapClient($config);
|
|
}
|
|
|
|
throw new MailClientConfigException(sprintf('Unrecognized mail client type "%s"', $account->getImapType()));
|
|
}
|
|
}
|