Initial xentral_oss_20.3.c9ffacf
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
<?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'
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user