
Utiliser PHPMailer et OAuth2, sans utiliser Composer
Pour un site PHP qui n’a pas accès à Composer, j’ai besoin de pouvoir envoyer des emails. Mais Google ne permet plus d’envoyer des mails avec un code d’application moins sécurisé. Il faut désormais passer par OAuth2.
Avec Composer
Si on a Composer, on peut installer toutes les dépendances facilement avec
composer require phpmailer/phpmailer
composer require league/oauth2-google
Pour ajouter toutes les dépendances dans les scripts, il suffit d’inclure
include "vendor/autoload.php";
Sans Composer
Récupérer PHPMailer et toutes ses dépendances
Installer dans un répertoire PHPMailer
le contenu du répertoire src
de https://github.com/PHPMailer/PHPMailer
Installer dans un répertoire PHPMailer\guzzle
le contenu du répertoire src
de https://github.com/guzzle/guzzle
Installer dans un répertoire PHPMailer\promises
le contenu du répertoire src
de https://github.com/guzzle/promises
Installer dans un répertoire PHPMailer\psr7
le contenu du répertoire src
de https://github.com/guzzle/psr7
Installer dans un répertoire PHPMailer\http-client
le contenu du répertoire src
de https://github.com/php-fig/http-client
Installer dans un répertoire PHPMailer\http-message
le contenu du répertoire src
de https://github.com/php-fig/http-message
Modifier le fichier get_oauth_token.php
A la racine du projet PHP, copier le fichier get_oauth_token.php
.
Le modifier pour ajouter au début :
namespace PHPMailer\PHPMailer;
require 'PHPMailer/Exception.php';
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';
require_once "PHPMailer/oauth2-client/Token/SettableRefreshTokenInterface.php";
require_once "PHPMailer/oauth2-client/Token/AccessTokenInterface.php";
require_once "PHPMailer/oauth2-client/Token/ResourceOwnerAccessTokenInterface.php";
require_once "PHPMailer/oauth2-client/Token/AccessToken.php";
require_once "PHPMailer/promises/Is.php";
require_once "PHPMailer/promises/PromiseInterface.php";
require_once "PHPMailer/promises/Promise.php";
require_once "PHPMailer/promises/TaskQueueInterface.php";
require_once "PHPMailer/promises/TaskQueue.php";
require_once "PHPMailer/promises/Utils.php";
require_once "PHPMailer/promises/PromiseInterface.php";
require_once "PHPMailer/promises/FulfilledPromise.php";
require_once "PHPMailer/guzzle/Handler/HeaderProcessor.php";
require_once "PHPMailer/guzzle/PrepareBodyMiddleware.php";
require_once "PHPMailer/promises/Create.php";
require_once "PHPMailer/guzzle/RequestOptions.php";
require_once "PHPMailer/http-message/StreamInterface.php";
require_once "PHPMailer/psr7/Stream.php";
require_once "PHPMailer/psr7/Utils.php";
require_once "PHPMailer/http-message/UriInterface.php";
require_once "PHPMailer/psr7/Uri.php";
require_once "PHPMailer/http-message/MessageInterface.php";
require_once "PHPMailer/http-message/ResponseInterface.php";
require_once "PHPMailer/http-message/RequestInterface.php";
require_once "PHPMailer/psr7/MessageTrait.php";
require_once "PHPMailer/psr7/MessageTrait.php";
require_once "PHPMailer/psr7/Request.php";
require_once "PHPMailer/psr7/Response.php";
require_once "PHPMailer/http-client/ClientInterface.php";
require_once "PHPMailer/oauth2-client/Tool/QueryBuilderTrait.php";
require_once "PHPMailer/oauth2-client/OptionProvider/OptionProviderInterface.php";
require_once "PHPMailer/oauth2-client/OptionProvider/PostAuthOptionProvider.php";
require_once "PHPMailer/guzzle/RedirectMiddleware.php";
require_once "PHPMailer/guzzle/Middleware.php";
require_once "PHPMailer/guzzle/Handler/StreamHandler.php";
require_once "PHPMailer/guzzle/Utils.php";
require_once "PHPMailer/guzzle/ClientInterface.php";
require_once "PHPMailer/guzzle/ClientTrait.php";
require_once "PHPMailer/guzzle/Client.php";
require_once "PHPMailer/guzzle/HandlerStack.php";
require_once "PHPMailer/oauth2-client/Tool/ArrayAccessorTrait.php";
require_once "PHPMailer/oauth2-client/Tool/GuardedPropertyTrait.php";
require_once "PHPMailer/oauth2-client/Tool/BearerAuthorizationTrait.php";
require_once "PHPMailer/oauth2-client/Tool/RequestFactory.php";
require_once "PHPMailer/oauth2-client/Tool/RequiredParameterTrait.php";
require_once "PHPMailer/oauth2-client/Grant/Exception/InvalidGrantException.php";
require_once "PHPMailer/oauth2-client/Grant/AbstractGrant.php";
require_once "PHPMailer/oauth2-client/Grant/AuthorizationCode.php";
require_once "PHPMailer/oauth2-client/Grant/GrantFactory.php";
require_once 'PHPMailer/oauth2-client/Provider/AbstractProvider.php';
require_once 'PHPMailer/oauth2-client/Provider/ResourceOwnerInterface.php';
require_once 'PHPMailer/oauth2-google/Provider/Google.php';
require_once 'PHPMailer/oauth2-google/Provider/GoogleUser.php';
Créer un token OAuth2 pour Gmail
- Aller sur https://console.cloud.google.com/apis/credentials
- Créer un nouveau projet.
- Dans ce projet, aller dans
Identifiant
et cliquer surCréer des identifiants
->ID client OAuth
. - Choisir « Application web ».
- Donner un nom.
- Pas besoin de remplir la partie « Origines JavaScript ».
- Dans « URI de redirection autorisés », il faut ajouter l’URL de la page
get_oauth_token
.
Exemple : http://localhost/monsite/get_oauth_token.php - Récupérer l’identifiant et la clé secrète.
- Activer l’API Gmail.
Générer un refresh_token
- Dans un navigateur, appeler la page
get_oauth_token.php
(la même que celle renseignée dan les URI autorisés dans Google). - Choisir « Google ».
- Remplir l’identifiant et le secret.
- La fenêtre de demande de confirmation de Google apparait.
- En validant, on reçoit un
refresh_token
. Il faudra l’utiliser pour pouvoir envoyer des emails.
Le refresh token
n’a pas de durée de validité.
Si on a déjà créer un refresh token
, Google n’en fournira pas un autre tant que le premier sera valide.
Pour le supprimer, on peut le révoquer en allant sur https://myaccount.google.com/permissions?hl=fr
Envoyer un email
// Rapporte les erreurs d'exécution de script
error_reporting(E_ALL);
date_default_timezone_set('Europe/Paris');
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\OAuth;
use League\OAuth2\Client\Provider\Google;
include "vendor/autoload.php";
$google_email = "noreply@cheatsheet.fr";
$oauth2_clientId = 'xxxxxxx.apps.googleusercontent.com';
$oauth2_clientSecret = 'yyyyyyy';
$oauth2_refreshToken = 'azertyuiop';
$mail = new PHPMailer(TRUE);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->setFrom($google_email, 'No Reply');
$mail->addAddress('test@test.fr', 'Name');
$mail->Subject = 'Test';
$mail->Body = 'This is a test.';
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = 'tls';
/* Google's SMTP */
/* Set AuthType to XOAUTH2. */
$mail->AuthType = 'XOAUTH2';
/* Create a new OAuth2 provider instance. */
$provider = new Google(
[
'clientId' => $oauth2_clientId,
'clientSecret' => $oauth2_clientSecret,
]
);
/* Pass the OAuth provider instance to PHPMailer. */
$mail->setOAuth(
new OAuth(
[
'provider' => $provider,
'clientId' => $oauth2_clientId,
'clientSecret' => $oauth2_clientSecret,
'refreshToken' => $oauth2_refreshToken,
'userName' => $google_email,
]
)
);
/* Finally send the mail. */
$mail->send();
}
catch (Exception $e)
{
echo $e->errorMessage();
}
catch (\Exception $e)
{
echo $e->getMessage();
}
Sources
https://alexwebdevelop.com/phpmailer-tutorial/#how-to-send-your-first-email
https://github.com/PHPMailer/PHPMailer/wiki/Using-Gmail-with-XOAUTH2