J'essaie de faire un simple formulaire de contact dans une application de nœud, en utilisant nodemailer
. Je souhaite que tous les msg soient envoyés depuis un compte gmail créé à cet effet, vers mon mail personnel.
côté client, je ne fais qu'obtenir le nom/mail/message du client et l'envoyer au serveur. Il fonctionne bien localement mais ne fonctionne pas lors du déploiement (sur heroku btw).
Après une recherche rapide, il semble que je doive générer un ClientId
et ClientSecret
à partir de Google Developers Console - ce que j'ai fait - mais quand il s'agit de générer un "jeton d'actualisation" je suis complètement perdu .
var smtpTransport = nodemailer.createTransport("SMTP",{
service:"Gmail",
auth:{
XOAuth2: {
user:"[email protected]",
clientId:"",
clientSecret:"",
refreshToken:""
}
}
});
Je suis confus: Qu'est-ce qu'un jeton d'actualisation et comment en obtenir un?
Notes de l'auteur de cette réponse:
Alors, j'ai finalement réussi à le comprendre. Je suis surpris de ne pas avoir trouvé plus de ressources à ce sujet, donc pour ceux qui ont besoin d'utiliser
Gmail
avecNodemailer
J'ai trouvé la réponse ici: http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html
Essayez de créer un nouvel utilisateur si vous en avez déjà un et que les choses ne fonctionnent pas bien. C'était le cas pour moi.
J'espère que cela sera utile à quelqu'un,
À votre santé
D'après la documentation trouvée ici :
Un jeton d'actualisation fournit à votre application un accès continu aux API Google lorsque l'utilisateur n'est pas connecté à votre application.
(...)
Considérations:
Veillez à stocker le jeton d'actualisation en toute sécurité et de façon permanente, car vous ne pouvez obtenir un jeton d'actualisation que la première fois que vous effectuez le flux d'échange de code.
Le nombre de jetons d'actualisation émis est limité: une limite par combinaison client/utilisateur et une autre par utilisateur sur tous les clients. Si votre application demande trop de jetons d'actualisation, elle peut s'exécuter dans ces limites, auquel cas les anciens jetons d'actualisation cessent de fonctionner.
Voir aussi Accès hors ligne et tilisation d'un jeton d'actualisation .
Comme indiqué ici , vous devez:
FAITES ATTENTION À spécifiant
https://developers.google.com/oauthplayground
en tant que Rediriger l'URI lorsque vous créez un nouvel utilisateur dans la console. Sinon, vous aurez une erreur.
https://mail.google.com/
car c'est le seul besoin de nodemailer
. Cliquez ensuite sur le bouton Autoriser les API.Pour ceux qui ont cherché un exemple de travail/extrait de code, suivez la réponse de Radioreve jusqu'à ce que vous puissiez obtenir le jeton d'accès et le jeton d'actualisation. (Fondamentalement, allez sur le terrain de jeu, assurez-vous qu'il demande l'accès pour envoyer du courrier et mail.google.com, donnez la permission, échangez le code d'autorisation pour les jetons)
Notez que l'heure expires
que j'ai entrée était new Date().getTime() + 2000
, ce qui était proche des secondes d'expiration vues sur le terrain de jeu. Je ne sais pas si j'ai dû entrer le jeton d'accès et l'heure d'expiration avec précision car il semble actualiser automatiquement le jeton.
Utilisez cet exemple de code écrit dans ECMAScript 6:
const user_name = '[email protected]';
const refresh_token = '';
const access_token = '';
const client_id = '';
const client_secret = '';
const email_to = '[email protected]';
const nodemailer = require('nodemailer');
let transporter = nodemailer
.createTransport({
service: 'Gmail',
auth: {
type: 'OAuth2',
clientId: client_id,
clientSecret: client_secret
}
});
transporter.on('token', token => {
console.log('A new access token was generated');
console.log('User: %s', token.user);
console.log('Access Token: %s', token.accessToken);
console.log('Expires: %s', new Date(token.expires));
});
// setup e-mail data with unicode symbols
let mailOptions = {
from : user_name, // sender address
to : email_to, // list of receivers
subject : 'Hello ✔', // Subject line
text : 'Hello world ?', // plaintext body
html : '<b>Hello world ?</b>', // html body
auth : {
user : user_name,
refreshToken : refresh_token,
accessToken : access_token,
expires : 1494388182480
}
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return console.log(error);
}
console.log('Message sent: ' + info.response);
});