OpenXE/classes/Modules/SystemMailClient/MailClientConfigProvider.php
2021-05-21 08:49:41 +02:00

132 lines
3.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Xentral\Modules\SystemMailClient;
use Exception;
use Xentral\Components\MailClient\Config\ImapMailClientConfig;
use Xentral\Modules\GoogleApi\Client\GoogleApiClientFactory;
use Xentral\Modules\GoogleApi\Service\GoogleAccountGateway;
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;
class MailClientConfigProvider
{
/** @var EmailAccountGateway $accountGateway */
private $accountGateway;
/** @var GoogleAccountGateway $googleAccountGateway */
private $googleAccountGateway;
/** @var GoogleApiClientFactory $clientFactory */
private $clientFactory;
/**
* @param EmailAccountGateway $accountGateway
* @param GoogleAccountGateway $googleAccountGateway
* @param GoogleApiClientFactory $clientFactory
*/
public function __construct(
EmailAccountGateway $accountGateway,
GoogleAccountGateway $googleAccountGateway,
GoogleApiClientFactory $clientFactory
)
{
$this->accountGateway = $accountGateway;
$this->googleAccountGateway = $googleAccountGateway;
$this->clientFactory = $clientFactory;
}
/**
* @param string $senderEmail
*
* @throws MailClientConfigException
*
* @return ImapMailClientConfig
*/
public function createImapConfigFromEmail(string $senderEmail): ImapMailClientConfig
{
try {
$account = $this->accountGateway->getAccountByEmail($senderEmail);
return $this->createImapConfigFromAccount($account);
} catch (EmailBackupAccountException $e) {}
try {
return $this->createGoogleOauthImapConfig($senderEmail);
} catch (Exception $e) {
throw new MailClientConfigException($e->getMessage(), $e->getCode(), $e);
}
}
/**
* @param EmailBackupAccount $account
*
* @throws OAuthException
*
* @return ImapMailClientConfig
*/
public function createImapConfigFromAccount(EmailBackupAccount $account): ImapMailClientConfig
{
$sslEnabled = false;
switch ($account->getImapType()) {
//IMAP with SSL
case 3:
$sslEnabled = true;
break;
// IMAP via Google OAuth
case 5:
return $this->createGoogleOauthImapConfig($account->getEmailAddress());
break;
// IMAP without SSL
default:
break;
}
return new ImapMailClientConfig(
$account->getImapServer(),
$account->getImapPort(),
$account->getUserName(),
$account->getPassword(),
ImapMailClientConfig::AUTH_BASIC,
$sslEnabled,
'INBOX'
);
}
/**
* @param string $email
*
* @throws OAuthException
*
* @return ImapMailClientConfig
*/
private function createGoogleOauthImapConfig(string $email): ImapMailClientConfig
{
$token = null;
try {
$account = $this->googleAccountGateway->getAccountByGmailAddress($email);
$this->clientFactory->createClient($account->getUserId());
$token = $this->googleAccountGateway->getAccessToken($account->getId());
} catch (Exception $e) {
throw new OAuthException($e->getMessage(), $e->getCode(), $e);
}
return new ImapMailClientConfig(
'imap.gmail.com',
993,
$email,
$token->getToken(),
ImapMailClientConfig::AUTH_XOAUTH2,
true,
'INBOX'
);
}
}