J'essaie d'utiliser nodemailer pour implémenter un formulaire de contact à l'aide de NodeJS mais cela ne fonctionne que sur le local, cela ne fonctionne pas sur un serveur distant ...
Mon message d'erreur:
[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787
[website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp]
[website.fr-11 (out) 2013-11-09T15:40:26] name: 'AuthError',
[website.fr-11 (out) 2013-11-09T15:40:26] data: '534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX\r\n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC\r\n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX\r\n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r\r\n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.\r\n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787\r\n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp',
[website.fr-11 (out) 2013-11-09T15:40:26] stage: 'auth' }
Mon contrôleur:
exports.contact = function(req, res){
var name = req.body.name;
var from = req.body.from;
var message = req.body.message;
var to = '*******@gmail.com';
var smtpTransport = nodemailer.createTransport("SMTP",{
service: "Gmail",
auth: {
user: "******@gmail.com",
pass: "*****"
}
});
var mailOptions = {
from: from,
to: to,
subject: name+' | new message !',
text: message
}
smtpTransport.sendMail(mailOptions, function(error, response){
if(error){
console.log(error);
}else{
res.redirect('/');
}
});
}
J'ai résolu ce problème en allant à l'URL suivante (tout en étant connecté à Google avec le compte à partir duquel je veux envoyer du courrier):
https://www.google.com/settings/security/lesssecureapps
Là, j'ai activé des applications moins sécurisées.
Terminé
Vous devez utiliser un jeton XOAuth2 pour vous connecter à Gmail. Pas de problème, Nodemailer le sait déjà:
var smtpTransport = nodemailer.createTransport('SMTP', {
service: 'Gmail',
auth: {
XOAuth2: {
user: smtpConfig.user,
clientId: smtpConfig.client_id,
clientSecret: smtpConfig.client_secret,
refreshToken: smtpConfig.refresh_token,
accessToken: smtpConfig.access_token,
timeout: smtpConfig.access_timeout - Date.now()
}
}
};
Vous devez accéder à Google Cloud Console pour enregistrer votre application. Ensuite, vous devez récupérer des jetons d'accès pour les comptes que vous souhaitez utiliser. Vous pouvez utiliser passportjs pour cela.
Voici à quoi ça ressemble dans mon code:
var passport = require('passport'),
GoogleStrategy = require('./google_oauth2'),
config = require('../config');
passport.use('google-imap', new GoogleStrategy({
clientID: config('google.api.client_id'),
clientSecret: config('google.api.client_secret')
}, function (accessToken, refreshToken, profile, done) {
console.log(accessToken, refreshToken, profile);
done(null, {
access_token: accessToken,
refresh_token: refreshToken,
profile: profile
});
}));
exports.mount = function (app) {
app.get('/add-imap/:address?', function (req, res, next) {
passport.authorize('google-imap', {
scope: [
'https://mail.google.com/',
'https://www.googleapis.com/auth/userinfo.email'
],
callbackURL: config('web.vhost') + '/add-imap',
accessType: 'offline',
approvalPrompt: 'force',
loginHint: req.params.address
})(req, res, function () {
res.send(req.user);
});
});
};
Consultez le guide officiel de nodemailer pour connecter Gmail:
https://community.nodemailer.com/using-gmail/
-
Cela fonctionne pour moi après avoir fait ceci:
Solution facile:
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
Host: 'smtp.gmail.com',
auth: {
user: '[email protected]',
pass: 'realpasswordforaboveaccount'
}
}));
var mailOptions = {
from: '[email protected]',
to: '[email protected]',
subject: 'Sending Email using Node.js[nodemailer]',
text: 'That was easy!'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
Étape 1:
allez ici https://myaccount.google.com/lesssecureapps et activez des applications moins sécurisées. Si cela ne fonctionne pas alors
Étape 2
allez ici https://accounts.google.com/DisplayUnlockCaptcha et activez/continuez, puis essayez.
pour moi l’étape 1 seule ne fonctionnait pas, je devais donc passer à l’étape 2.
j'ai également essayé de supprimer le paquet nodemailer-smtp-transport et, à ma grande surprise, cela fonctionne. mais ensuite, lorsque j'ai redémarré mon système, cela m'a donné la même erreur. J'ai donc dû activer l'application moins sécurisée (je l'ai désactivée après mon travail).
alors pour le plaisir je l'ai juste essayé avec (application moins sécurisée) et vola a fonctionné encore!
J'ai eu le même problème. Autoriser les "applications moins sécurisées" dans mes paramètres de sécurité Google, ça a fonctionné!
Essayez de désactiver les captchas dans votre compte gmail. probablement déclenché en fonction de l'adresse IP du demandeur .. Voir: Comment utiliser GMail en tant que serveur SMTP libre et comment vaincre captcha
Le même problème m'est arrivé aussi. J'ai testé mon système sur localhost puis déployé sur le serveur (situé dans un pays différent). Lorsque j'ai essayé le système sur le serveur de production, j'ai constaté cette erreur. J'ai essayé ceux-ci pour le réparer:
Pour moi, je travaille de cette façon, en utilisant le port et la sécurité (des problèmes d’envoi de courriels à partir de gmail avec PHP sans paramètres de sécurité)
J'espère aidera quelqu'un.
var sendEmail = function(somedata){
var smtpConfig = {
Host: 'smtp.gmail.com',
port: 465,
secure: true, // use SSL,
// you can try with TLS, but port is then 587
auth: {
user: '***@gmail.com', // Your email id
pass: '****' // Your password
}
};
var transporter = nodemailer.createTransport(smtpConfig);
// replace hardcoded options with data passed (somedata)
var mailOptions = {
from: '[email protected]', // sender address
to: '[email protected]', // list of receivers
subject: 'Test email', // Subject line
text: 'this is some text', //, // plaintext body
html: '<b>Hello world ✔</b>' // You can choose to send an HTML body instead
}
transporter.sendMail(mailOptions, function(error, info){
if(error){
return false;
}else{
console.log('Message sent: ' + info.response);
return true;
};
});
}
exports.contact = function(req, res){
// call sendEmail function and do something with it
sendEmail(somedata);
}
toutes les configurations sont listées ici (avec exemples)
Il est résolu à l'aide du module "nodemailer-smtp-transport" de createTransport.
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '*******@gmail.com',
pass: '*****password'
}
}));
Aucune des solutions ci-dessus n'a fonctionné pour moi. J'ai utilisé le code qui existe dans la documentation de NodeMailer . Cela ressemble à ceci:
let transporter = nodemailer.createTransport({
Host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: '[email protected]',
serviceClient: '113600000000000000000',
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
expires: 1484314697598
}
});
A bien fonctionné:
1- installez nodemailer, package s'il n'est pas installé (tapez cmd): npm install nodemailer
2- allez sur https://myaccount.google.com/lesssecureapps et activez Autoriser les applications moins sécurisées.
3- écrire le code:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: '[email protected]',
pass: 'truePassword'
}
});
const mailOptions = {
from: '[email protected]', // sender address
to: '[email protected]', // list of receivers
subject: 'test mail', // Subject line
html: '<h1>this is a test mail.</h1>'// plain text body
};
transporter.sendMail(mailOptions, function (err, info) {
if(err)
console.log(err)
else
console.log(info);
})
4- profiter!
tout votre code est correct, il ne reste que le lien https://myaccount.google.com/security
et maintenez le défilement vers le bas et vous trouverez trouvé Autoriser les applications moins sécurisées: ON et maintenez-le activé, vous ne trouverez aucune erreur.
Ajoutez simplement "Host", cela fonctionnera.
Host: 'smtp.gmail.com'
Activez ensuite "lesssecureapps" en cliquant sur le lien ci-dessous
Si vous utilisez Express, express-mailer
wrapsnodemailer
très bien et est très facile à utiliser:
//# config/mailer.js
module.exports = function(app) {
if (!app.mailer) {
var mailer = require('express-mailer');
console.log('[MAIL] Mailer using user ' + app.config.mail.auth.user);
return mailer.extend(app, {
from: app.config.mail.auth.user,
Host: 'smtp.gmail.com',
secureConnection: true,
port: 465,
transportMethod: 'SMTP',
auth: {
user: app.config.mail.auth.user,
pass: app.config.mail.auth.pass
}
});
}
};
//# some.js
require('./config/mailer.js)(app);
app.mailer.send("path/to/express/views/some_view", {
to: ctx.email,
subject: ctx.subject,
context: ctx
}, function(err) {
if (err) {
console.error("[MAIL] Email failed", err);
return;
}
console.log("[MAIL] Email sent");
});
//#some_view.ejs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><%= subject %></title>
</head>
<body>
...
</body>
</html>
exports.mailSend = (res, fileName, object1, object2, to, subject, callback)=> {
var smtpTransport = nodemailer.createTransport('SMTP',{ //smtpTransport
Host: 'hostname,
port: 1234,
secureConnection: false,
// tls: {
// ciphers:'SSLv3'
// },
auth: {
user: 'username',
pass: 'password'
}
});
res.render(fileName, {
info1: object1,
info2: object2
}, function (err, HTML) {
smtpTransport.sendMail({
from: "[email protected]",
to: to,
subject: subject,
html: HTML
}
, function (err, responseStatus) {
if(responseStatus)
console.log("checking dta", responseStatus.message);
callback(err, responseStatus)
});
});
}
Vous devez ajouter le type secureConnection dans votre code.
Pour une raison quelconque, le fait d'autoriser une configuration d'application moins sécurisée n'a pas fonctionné pour moi, même le captcha. Je devais faire une autre étape qui active la configuration IMAP:
Sur la page d'aide de Google: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin
premier install nodemailer
npm install nodemailer --save
importer dans un fichier js
const nodemailer = require("nodemailer");
const smtpTransport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "[email protected]",
pass: "password"
},
tls: {
rejectUnauthorized: false
}
});
const mailOptions = {
from: "[email protected]",
to: [email protected],
subject: "Welcome to ",
text: 'hai send from me'.
};
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
}
else {
console.log("mail sent");
}
});
travailler dans mon application
J'utilisais une ancienne version de nodemailer 0.4.1 et j'avais ce problème. J'ai mis à jour à 0.5.15 et tout fonctionne bien maintenant.
Edité package.json pour refléter les changements puis
npm install
J'ai trouvé la méthode la plus simple, décrite dans cet article mentionné dans La réponse de Greg T , consistait à créer un mot de passe d'application disponible après l'activation de 2FA pour le compte.
myaccount.google.com> Connexion et sécurité> Connexion à Google> Mots de passe des applications
Cela vous donne un mot de passe alternatif pour le compte, il vous suffit ensuite de configurer nodemailer en tant que service SMTP normal.
var smtpTransport = nodemailer.createTransport({
Host: "smtp.gmail.com",
port: 587,
auth: {
user: "[email protected]",
pass: "app password"
}
});
Bien que Google recommande Oauth2 comme la meilleure option, cette méthode est simple et n’a pas encore été mentionnée dans cette question.
Conseil supplémentaire: j’ai également constaté que vous pouvez ajouter le nom de votre application à l’adresse "de" et que GMail ne le remplace pas uniquement par l’e-mail du compte, comme c’est le cas si vous essayez d’utiliser une autre adresse. c'est à dire.
from: 'My Pro App Name <[email protected]>'
Il suffit d’être présent: 1- L’authentification Gmail pour autoriser les e-mails de bas niveau n’accepte pas avant de redémarrer votre navigateur client 2- Si vous souhaitez envoyer des e-mails avec nodemailer sans utiliser le protocole xouath2, vous devez écrire comme secureconnection: false comme ci-dessous
const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
routes.get('/test', (req, res) => {
res.status(200).json({ message: 'test!' });
});
routes.post('/Email', (req, res) =>{
var smtpTransport = nodemailer.createTransport({
Host: "smtp.gmail.com",
secureConnection: false,
port: 587,
requiresAuth: true,
domains: ["gmail.com", "googlemail.com"],
auth: {
user: "your gmail account",
pass: "your password*"
}
});
var mailOptions = {
from: '[email protected]',
to:'[email protected]',
subject: req.body.subject,
//text: req.body.content,
html: '<p>'+req.body.content+' </p>'
};
smtpTransport.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log('Error while sending mail: ' + error);
} else {
console.log('Message sent: %s', info.messageId);
}
smtpTransport.close();
});
})
module.exports = routes;