web-dev-qa-db-fra.com

L'envoi d'e-mail via Node.js à l'aide de nodemailer ne fonctionne pas

J'ai configuré un serveur NodeJS de base (à l'aide du module nodemailer) localement (http://localhost:8080) afin de pouvoir vérifier si le serveur peut réellement envoyer des courriels.

Si je comprends bien l'option SMTP (corrigez-moi si je me trompe), je peux soit envoyer un courrier électronique de mon serveur au compte de messagerie de quelqu'un directement, ou que je peux envoyer. l'email, toujours en utilisant Node.js, mais via un compte email réel (dans ce cas, mon compte Gmail personnel), c'est-à-dire en utilisant SMTP. Cette option nécessite que je me connecte à ce compte à distance via NodeJS.

Donc, sur le serveur ci-dessous, j'essaie en fait d'utiliser NodeJs pour envoyer un courrier électronique depuis mon compte de messagerie personnel vers mon compte de messagerie personnel.

Voici mon serveur simple:

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport("SMTP", {
    service: 'Gmail',
    auth: {
        user: '*my personal Gmail address*',
        pass: '*my personal Gmail password*'
    }
});

var http = require('http');
var httpServer = http.createServer(function (request, response)
{
    transporter.sendMail({
       from: '*my personal Gmail address*',
       to: '*my personal Gmail address*',
       subject: 'hello world!',
       text: 'hello world!'
    });
}).listen(8080);

Cependant, ça ne marche pas. J'ai reçu un email de Google disant: 

Compte Google: tentative de connexion bloquée Si c'était toi Vous pouvez passer à une application créée par Google, telle que Gmail, pour accéder à votre compte (recommandé) ou modifier vos paramètres dans https://www.google.com/settings/security/lesssecureapps afin que votre compte soit n ° plus protégé par les normes de sécurité modernes. 

Je n'ai pas pu trouver de solution au problème ci-dessus sur la page nodemailer GitHub. Quelqu'un at-il une solution/suggestion?

Merci! :-)

19
Sprout Coder

La réponse est dans le message de Google. 

Pour la deuxième partie du problème, et en réponse à 

En fait, je ne fais que suivre les étapes de la page nodemailer github afin qu'il n'y ait pas d'erreur dans mon code 

Je vous renvoie à la page nodemailer github et à cette partie de code:

var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
    user: '[email protected]',
    pass: 'userpass'
}
});

Il diffère légèrement de votre code par le fait que vous avez: nodemailer.createTransport("SMTP". Supprimez le paramètre SMTP et cela fonctionne (juste testé). Aussi, pourquoi l'encapsuler dans un serveur http? les oeuvres suivantes:

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        user: 'xxx',
        pass: 'xxx'
    }
});

console.log('created');
transporter.sendMail({
from: '[email protected]',
  to: '[email protected]',
  subject: 'hello world!',
  text: 'hello world!'
});
42
xShirase

Pour ceux qui veulent réellement utiliser OAuth2/ne veulent pas rendre l'application "moins sécurisée", vous pouvez y parvenir en

  1. Recherchez "API Gmail" dans la console de Google API et cliquez sur "Activer".
  2. Suivez les étapes décrites à https://developers.google.com/gmail/api/quickstart/nodejs . Dans le fichier quickstart.js, changez la variable SCOPES var de ['https://www.googleapis.com/auth/gmail.readonly'] à ['https://mail.google.com/'] dans le fichier quickstart js fourni comme suggéré dans le dépannage de https://nodemailer.com/smtp/oauth2/
  3. Après avoir suivi les étapes de (2), le fichier JSON généré contiendra les attributs acessToken, refreshToken et expires nécessaires dans/ OAuth2 Examples for Nodemailer

De cette façon, vous pouvez utiliser l'authentification OAuth2 comme suit

let transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        type: 'OAuth2',
        user: '[email protected]',
        clientId: '000000000000-xxx0.apps.googleusercontent.com',
        clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
        refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
});

au lieu de stocker votre mot de passe Gmail en texte brut et de réduire la sécurité de votre compte.

13
ironicaldiction

je viens de définir mon domaine à: smtp.gmail.com et cela fonctionne. J'utilise un VPS Vultr. 

le code:

const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs = require('fs');

let transporter = nodemailer.createTransport({
    Host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '[email protected]',
        pass: 'xxx'
    }
});

let mailOptions = {
    from: '"xxx" <[email protected]>',
    to: '[email protected]',
    subject: 'Teste Templete ✔',
    html: ejs.render( fs.readFileSync('e-mail.ejs', 'utf-8') , {mensagem: 'olá, funciona'})
};

transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }
    console.log('Message %s sent: %s', info.messageId, info.response);
});

mon modèle ejs (e-mail.ejs):

<html>
    <body>
        <span>Esse é um templete teste</span>
        <p> gerando com o EJS - <%=mensagem%> </p>
    </body>
</html>

Assure-toi:

bonne journée ;)

Vous n'avez besoin que du mot de passe d'application pour google auth, puis remplacez votre mot de passe google dans votre code. allez ici https://myaccount.google.com/apppasswords

exemple de code: 

const nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: '[email protected]',
      pass: 'app password here'
    }
  });
transporter.sendMail(option, function(error, info){
    if (error) {
      console.log(error);
    } else {
      console.log('Email sent: ' + info.response);
    }
});

 screenshot

3
kdgilang

À des fins de débogage, il est pratique d’implémenter une fonction de rappel (ce qu’ils ne font jamais sur la page nodemailer github) qui affiche le message d’erreur (s’il en existe un). 

transporter.sendMail({
    from: from,
    to: to,
    subject: subject,
    html: text
}, function(err){
    if(err)
        console.log(err);
})

Cela m'a aidé à résoudre mon problème ... Il s'avère que les nouvelles versions ne fonctionnent pas correctement: 

"On dirait que nodemailer 1.0 a des modifications radicales, il faut donc utiliser 0.7: http://www.nodemailer.com/

Message posté sur nodemailer au 17/12/15:

Ne mettez pas à niveau Nodemailer de 0,7 ou moins à 1.0 car des modifications importantes ont été apportées. Vous pouvez continuer à utiliser la branche 0.7 aussi longtemps que vous le souhaitez. Voir la documentation pour 0.7 ici . "

J'ai trouvé cette réponse ici

2
Maarten Meeusen

Bien que les réponses ci-dessus fonctionnent, j'aimerais préciser que vous pouvez réduire la sécurité de Gmail en suivant les DEUX étapes suivantes.

ÉTAPE 1

Compte Google: tentative de connexion bloquée Si tel était votre cas Vous pouvez passer à une application créée par Google, telle que Gmail, pour accéder à votre compte (recommandé) ou modifier vos paramètres à l'adresse https://www.google.com/settings/. security/lesssecureapps afin que votre compte ne soit plus protégé par les normes de sécurité modernes.

ÉTAPE 2

En plus d'activer Autoriser les applications moins sécurisées, vous devrez peut-être également accéder à https://accounts.google.com/DisplayUnlockCaptcha et cliquer sur Continuer.

1
Ahmad Awais

essayez ce code son travail pour moi.

var http = require('http');
var nodemailer = require('nodemailer');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});

  var fromEmail = '[email protected]';
  var toEmail = '[email protected]';

  var transporter = nodemailer.createTransport({
    Host: 'domain',
    port: 587,
    secure: false, // use SSL
    debug: true,
      auth: {
        user: '[email protected]',
        pass: 'userpassword'
      }
  });
   transporter.sendMail({
      from: fromEmail,
      to: toEmail,
      subject: 'Regarding forget password request',
      text: 'This is forget password response from your app',
      html: '<p>Your password is <b>sample</b></p>'
  }, function(error, response){
      if(error){
          console.log('Failed in sending mail');
          console.dir({success: false, existing: false, sendError: true});
          console.dir(error);
          res.end('Failed in sending mail');
      }else{
          console.log('Successful in sending email');
          console.dir({success: true, existing: false, sendError: false});
          console.dir(response);
          res.end('Successful in sending email');
      }
  });
}).listen(8000);
console.log('Server listening on port 8000');

réponse:  

Successful in sending email
{ success: true, existing: false, sendError: false }
{ accepted: [ '[email protected]' ],
  rejected: [],
  response: '250 2.0.0 uAMACW39058154 Message accepted for delivery',
  envelope: 
   { from: '[email protected]',
     to: [ '[email protected]' ] },
  messageId: '[email protected]' }
0
KARTHIKEYAN.A

Et installez le module smtp en tant que dépendance:

npm install smtp 

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
  service: 'gmail',
  type: "SMTP",
  Host: "smtp.gmail.com",
  secure: true,
  auth: {
    user: '[email protected]',
    pass: 'YourGmailPassword'
  }
});

var mailOptions = {
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Sending Email to test Node.js nodemailer',
  text: 'That was easy to test!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent');
  }
});

Accédez à https://myaccount.google.com/lesssecureapps Et modifiez-le SUR car Certaines applications et certains appareils utilisent une technologie de connexion moins sécurisée, ce qui rend votre compte plus vulnérable. Vous pouvez désactiver l'accès à ces applications, ce que nous recommandons, ou activer l'accès si vous souhaitez les utiliser malgré les risques. 

0
Azran Khan