pluginDescription->name = acym_translation('ACYM_GOOGLE');
}
public function onAcymGetSendingMethods(&$data, $isMailer = false)
{
if ($isMailer) {
return;
}
$data['sendingMethods'][self::SENDING_METHOD_ID] = [
'name' => $this->pluginDescription->name,
'image' => ACYM_IMAGES.'mailers/google.svg',
];
}
public function onAcymGetSendingMethodsHtmlSetting(&$data)
{
$username = $this->config->get('google_username', $this->config->get('from_email'));
$setupDocumentation = ACYM_DOCUMENTATION.'setup/configuration/mail-configuration/set-up-oauth-2.0';
$redirectUrl = trim($this->config->get('google_redirect_url', acym_baseURI()));
$refreshToken = $this->config->get('google_refresh_token');
$refreshTokenExpiration = $this->config->get('google_refresh_token_expiration');
$mustAuthenticate = empty($refreshToken) || (!empty($refreshTokenExpiration) && $refreshTokenExpiration < time());
$mailerHelper = new MailerHelper();
ob_start();
?>
config->get('mailer_method') !== self::SENDING_METHOD_ID) {
return;
}
$clientId = $this->config->get('google_client_id');
$clientSecret = $this->config->get('google_client_secret');
$redirectUrl = $this->config->get('google_redirect_url');
} else {
if ($this->config->get('bounce_server') !== 'imap.gmail.com') {
return;
}
$clientId = $this->config->get('bounce_client_id');
$clientSecret = $this->config->get('bounce_client_secret');
$redirectUrl = acym_baseURI();
}
if (empty($clientId) || empty($clientSecret) || empty($redirectUrl)) {
acym_enqueueMessage(acym_translation('ACYM_PLEASE_FILL_CLIENT_ID_SECRET'), 'error', false);
return;
}
$consentUrl = 'https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&prompt=consent&';
$consentUrl .= 'client_id='.urlencode($clientId);
$consentUrl .= '&response_type=code';
$consentUrl .= '&redirect_uri='.urlencode($redirectUrl);
$consentUrl .= '&scope='.urlencode('https://mail.google.com/');
$consentUrl .= '&state=acymailing'.($isSmtp ? 'smtp' : 'bounce');
}
/**
* Doc: https://developers.google.com/identity/protocols/oauth2/web-server#httprest_3
*/
public function onAcymOauthCredentialsCreation(bool $isSmtp, string $code): void
{
if ($isSmtp) {
if ($this->config->get('mailer_method') !== self::SENDING_METHOD_ID) {
return;
}
$clientId = trim($this->config->get('google_client_id'));
$clientSecret = trim($this->config->get('google_client_secret'));
$redirectUrl = trim($this->config->get('google_redirect_url', acym_baseURI()));
} else {
if ($this->config->get('bounce_server') !== 'imap.gmail.com') {
return;
}
$clientId = trim($this->config->get('bounce_client_id'));
$clientSecret = trim($this->config->get('bounce_client_secret'));
$redirectUrl = acym_baseURI();
}
if (empty($clientId) || empty($clientSecret)) {
acym_enqueueMessage(acym_translation('ACYM_PLEASE_FILL_CLIENT_ID_SECRET'), 'error', false);
return;
}
$response = acym_makeCurlCall(
'https://oauth2.googleapis.com/token',
[
'method' => 'POST',
'data' => [
'grant_type' => 'authorization_code',
'code' => $code,
'client_id' => $clientId,
'client_secret' => $clientSecret,
'redirect_uri' => $redirectUrl,
],
]
);
acym_logError('Response from OAuth call: '.json_encode($response), self::SENDING_METHOD_ID);
if (!empty($response['error'])) {
acym_enqueueMessage(acym_translationSprintf('ACYM_SMTP_OAUTH_ERROR', $response['error']), 'error', false);
return;
}
$expiringTime = time() + (int)$response['expires_in'];
if (!empty($response['refresh_token_expires_in'])) {
$refreshExpiringTime = time() + (int)$response['refresh_token_expires_in'];
acym_enqueueMessage(
acym_translationSprintf(
'ACYM_OAUTH_TEMPORARY',
acym_date($refreshExpiringTime, 'ACYM_DATE_FORMAT_LC2')
),
'info',
false
);
} else {
$refreshExpiringTime = 0;
acym_enqueueMessage(acym_translation('ACYM_SMTP_OAUTH_OK'), 'info');
}
if ($isSmtp) {
$newConfig = [
'google_access_token' => $response['access_token'],
'google_access_token_expiration' => $expiringTime,
'google_refresh_token' => $response['refresh_token'],
'google_refresh_token_expiration' => $refreshExpiringTime,
];
} else {
$newConfig = [
'bounce_access_token' => $response['access_token'],
'bounce_access_token_expiration' => $expiringTime,
'bounce_refresh_token' => $response['refresh_token'],
'bounce_refresh_token_expiration' => $refreshExpiringTime,
];
}
$this->config->saveConfig($newConfig);
acym_config(true);
}
public function onAcymOauthRevoke(): void
{
if ($this->config->get('mailer_method') !== self::SENDING_METHOD_ID) {
return;
}
$this->config->saveConfig(
[
'google_refresh_token' => '',
'google_refresh_token_expiration' => '',
]
);
}
}