web-dev-qa-db-fra.com

Nodemailer avec Gmail et NodeJS

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('/');
        }
    });
}
74
tonymx227

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é

108
brafdlog

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);
      });
  });
};
35
Laurent Perrin

Consultez le guide officiel de nodemailer pour connecter Gmail:

https://community.nodemailer.com/using-gmail/

-

Cela fonctionne pour moi après avoir fait ceci:

  1. Activer les applications moins sécurisées - https://www.google.com/settings/security/lesssecureapps
  2. Désactivez Captcha temporairement pour pouvoir connecter le nouvel appareil/serveur - https://accounts.google.com/b/0/displayunlockcaptcha
31
Greg T

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!

22
Zaheen

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é!

14

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

8
sfnd

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:

  1. https://www.google.com/settings/security/lesssecureapps Activé, mais ce n'était pas ma solution
  2. https://g.co/allowaccess J'ai autorisé l'accès depuis l'extérieur pour une durée limitée, ce qui a résolu mon problème.
8
Ahmet Can Güven

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)

7
Angel M.

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'
    }
}));
5
Girish Rathod

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
    }
}); 
5
Hamid

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!

4

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. 

3
Y. Joy Ch. Singha

Ajoutez simplement "Host", cela fonctionnera.

Host: 'smtp.gmail.com'

Activez ensuite "lesssecureapps" en cliquant sur le lien ci-dessous

https://myaccount.google.com/lesssecureapps

3
Milan Panigrahi

Si vous utilisez Express, express-mailerwrapsnodemailer 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>
3
malix
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.

2
aaditya

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

  • En haut à droite, cliquez sur Paramètres Paramètres.
  • Cliquez sur Paramètres.
  • Cliquez sur l'onglet Transfert et POP/IMAP.
  • Dans la section "Accès IMAP", sélectionnez Activer IMAP.
  • Cliquez sur Enregistrer les modifications.
2
mel3kings

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

1
arul mb

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
1
user1071182

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]>'
1
scipilot

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;
0
dewelloper