Publié le

Envoi d’email via Nodemailer en utilisant Gmail avec xoauth2

Auteurs

Nodemailer et xoauth2

Nodemailer est un module Node.js qui permet d’envoyer des emails.

Dans ce contexte, Nodemailer sera configuré pour envoyer des mails via le serveur Gmail.

⚠️ Gmail demande une autorisation pour pouvoir utiliser son serveur SMTP.
Le module xoauth2 permet de s’authentifier sur le serveur Gmail afin de pouvoir envoyer un mail à partir d’une adresse électronique Gmail.


Enregistrement de l’application sur Google API Console

La première étape consiste à enregistrer l’application sur Google APIs Console.

  1. Connectez-vous sur votre compte Gmail dans le navigateur.
  2. Ouvrez le lien Google APIs Console.
  3. Cliquez sur l’icône en haut à gauche de l’écran.
  4. Allez dans le Gestionnaire d’APIs.
conf-nodemailer1
  1. Cliquer sur le menu Identifiants (Créer un projet si vous en avez pas).
  2. Cliquer sur Créer des identifiants. Dans a liste qui s’affiche choisir ID Client OAuth
  3. Cliquer sur Configurer l’écran d’identification et compléter le formulaire et Enregistrer

Après ces opérations un Id client et un code secret client seront créés.

Obtention de token

Deux token sont necessaire pour assurer la sécurité lors de l’envoi de l’email.

Pour obtenir les token pour OAuth, connectez-vous à la page : OAuth playground conf-nodemailer2

Etape 1 :

Cliquer sur le bouton paramètre

conf-nodemailer3

Saisir le client Id est le client secret récupéré précédemment.

Etape 2 :

Choisir dans la liste Gmail API v1 et sélectionner les actions qu’on veut autoriser sur le compte.

conf-nodemailer4

Cliquer ensuite sur Authorize API et choisir le compte gmail sur lequel on ajoute l’autorisation (au cas où plusieurs comptes sont ouverts sur le navigateur).

Accepter l’accès du module OAuth2 au compte gmail.

conf-nodemailer5

Etape 3:

Cliquer sur Exchange authorization code for tokens pour récupérer refreshToken et accessToken.

conf-nodemailer6

Un paramètre, fixé par gmail, permet de changer le refreshtoken à chaque intervalle de temps.

Pour une authentification permanente sur le server, il faut utiliser uniquement Accestoken lors de la configuration de la connexion xoauth2.

Exemple de script d’envoi de mail

Si vous n’avez pas encore installer nodemailer et xoauth2, vous pouvez le faire avec les commandes suivantes :

Installation de nodemailer

npm install nodemailer  — save

Installation de xoauth2

npm install xoauth2  — save

Côté server le script d’envoi de mail ressemble à ceci :

var nodemailer = require('nodemailer');
 var xoauth2 = require('xoauth2');
 module.exports = function(app, route){
 return function(req, res, next){
   var data = req.body;
   // login
   var transporter = nodemailer.createTransport({
     service: 'gmail',
     auth: {
       xoauth2: xoauth2.createXOAuth2Generator({
         user: 'adresse_origine@gmail.com',
         clientId: 'client_id',
         clientSecret: 'client_secret',
         refreshToken: 'refreshtoken'
       })
     }
   });
   var message = {
       from: 'adresse_origine@gmail.com', // sender address
       to: 'adresse_destinataire', // list of receivers
       subject: data.objet, // Subject line
       text: data.contenu, // plaintext body
       html: '<b>Contact Nom</b>: ' + data.nom + '<br/><b>Contact Email</b>: ' + data.email + '<br/><b>Contact Sujet</b>: ' + data.objet + '<br/><br/>' + data.contenu // html body
   }
   if(typeof data.objet !== 'undefined' && typeof data.objet !== 'undefined' && typeof data.nom !== 'undefined' && typeof data.contenu !== 'undefined'){
     // send mail with defined transport object
     transporter.sendMail(message, function(error, info){
       if(error){
         console.log(error);
         res.status(400);
         res.json(data);
         next();
       }
       else{
         res.json(data);
         next();
       }
     });
   }
   else{
     res.status(400);
     res.json(data);
     next();
   }
 };
 };

Applications moins sécurisées (Less Secure Apps)

Il existe une autre méthode pour envoyer un email sans utiliser OAuth2.

Il s’agit de l’activation de l’accès « Applications moins sécurisées ».
Cette option permet de donner l’accès à toutes les applications qui souhaitent se connecter à votre compte Gmail.


Étape 1 : Connexion au compte Gmail

  1. Connectez-vous à votre compte Gmail.
  2. Rendez-vous sur le lien suivant :
    👉 https://myaccount.google.com/lesssecureapps
    (ou allez dans les paramètres de sécurité de votre compte Google)

Étape 2 : Activer l’accès

Activez l’option Autoriser les applications moins sécurisées.


L’envoi de mail devient ainsi plus simple avec Nodemailer.

var nodemailer = require('nodemailer')
module.exports = function (app, route) {
  return function (req, res, next) {
    console.log(req.body)
    var data = req.body
    var transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: 'adresse_origine@gmail.com',
        pass: 'mot_de_passe',
      },
    })
    var message = {
      from: 'adresse_origine@gmail.com', // sender address
      to: 'adresse_destinataire', // list of receivers
      subject: data.objet, // Subject line
      text: data.contenu, // plaintext body
      html:
        '<b>Contact Nom</b>: ' +
        data.nom +
        '<br/><b>Contact Email</b>: ' +
        data.email +
        '<br/><b>Contact Sujet</b>: ' +
        data.objet +
        '<br/><br/>' +
        data.contenu, // html body
    }

    // send mail with defined transport object
    transporter.sendMail(message, function (error, info) {
      if (error) {
        console.log(error)
        res.status(400)
        res.json('error')
        next()
      } else {
        //console.log('success email');
        res.json('sended')
        next()
      }
    })
  }
}

Cependant l’utilisation de less secure apps n’est pas conseillée.