mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-11-16 04:57:15 +01:00
132 lines
3.8 KiB
PHP
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'
|
||
|
);
|
||
|
}
|
||
|
}
|