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 firefox flask git google grep kobo linux manette markdown mp3 notepad++ office php pip privoxy python qlik qliksense qlikview realtek rebase selenium synology tor venv vim virtualenv vscode web windows wordpress xargs youtube yt-dlp

Tags

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