Aller au contenu
Cheat Sheet
PHP

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 sur Cré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

Héberger un site dans un container
Héberger plusieurs sites dans des containers Docker
gmail google mail oauth oauth2 php phpmailer

Catégories

  • Android
  • Calibre
  • Docker
  • Excel
  • Git
  • Google Sheet
  • Knime
  • Linux
  • Logiciels
  • Matériel
  • Non classé
  • Notepad++
  • PHP
  • Power BI
  • Programmation
  • Python
  • Qlik
  • Service
  • Synology
  • Visual Studio Code
  • VSCode
  • Windows
  • Word
  • WordPress

Étiquettes

adb android apache audio calibre convertion css debian docker drivers excel fichiers firefox flask google grep html kobo linux manette markdown mp3 notepad++ office php pip portable privoxy python qlik qliksense qlikview realtek selenium synology tor venv vim virtualenv vscode web windows wordpress xargs youtube

Tags

adb android apache audio calibre convertion css debian docker drivers excel fichiers firefox flask google grep html kobo linux manette markdown mp3 notepad++ office php pip portable privoxy python qlik qliksense qlikview realtek selenium synology tor venv vim virtualenv vscode web windows wordpress xargs youtube
Thème par Colorlib Propulsé par WordPress