it-swarm.com.de

Das Senden von E-Mails über Node.js mit Nodemailer funktioniert nicht

Ich habe einen einfachen NodeJS-Server (mit dem Nodemailer-Modul) lokal (http://localhost:8080) eingerichtet, nur damit ich testen kann, ob der Server E-Mails versenden kann.

Wenn ich die SMTP-Option richtig verstehe (bitte korrigieren Sie mich, wenn ich falsch liege), kann ich entweder versuchen, eine E-Mail von meinem Server an das E-Mail-Konto eines Benutzers direkt, oder zu senden, das ich senden kann Die E-Mail-Adresse verwendet weiterhin Node.js, aber über ein aktuelles E-Mail-Konto (in diesem Fall mein persönliches Google Mail-Konto), dh über SMTP. Bei dieser Option muss ich mich remote über NodeJS bei diesem Konto anmelden.

Auf dem Server unten versuche ich tatsächlich, NodeJs zu verwenden, um eine E-Mail von meinem persönlichen E-Mail-Konto an mein persönliches E-Mail-Konto zu senden.

Hier ist mein einfacher Server:

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);

Es funktioniert jedoch nicht. Ich habe eine E-Mail von Google erhalten: 

Google-Konto: Anmeldeversuch blockiert Wenn Sie das wären Sie können zu einer von Google erstellten App wie Google Mail wechseln, um auf Ihr Konto zuzugreifen (empfohlen) oder .__ zu ändern. Ihre Einstellungen unter https://www.google.com/settings/security/lesssecureapps , damit Ihr Konto keine .__ hat. länger durch moderne Sicherheitsstandards geschützt. 

Ich habe auf der GitHub-Seite mit Nodemailer keine Lösung für dieses Problem gefunden. Hat jemand eine Lösung/Vorschlag?

Vielen Dank! :-)

19
Sprout Coder

Die Antwort ist in der Nachricht von Google. 

Für den zweiten Teil des Problems und als Antwort auf 

Ich folge einfach den Schritten von der Nodemailer-Github-Seite, damit mein Code keine Fehler enthält 

Ich verweise Sie auf die Nodemailer-Github-Seite und diesen Code:

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

Es unterscheidet sich geringfügig von Ihrem Code, indem Sie Folgendes haben: nodemailer.createTransport("SMTP". Entfernen Sie den SMTP-Parameter, und es funktioniert (soeben getestet). Warum sollte man es in einem http-Server einkapseln? die folgenden arbeiten:

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

Für diejenigen, die tatsächlich OAuth2 verwenden möchten/die App nicht "weniger sicher" machen möchten, können Sie dies erreichen, indem Sie

  1. Suchen Sie in der Google API-Konsole nach "Google Mail-API" und klicken Sie auf "Aktivieren".
  2. Befolgen Sie die Schritte unter https://developers.google.com/gmail/api/quickstart/nodejs . Ändern Sie in der Datei quickstart.js die Variable SCOPES var von ['https://www.googleapis.com/auth/gmail.readonly'] bis ['https://mail.google.com/'] in der Schnellstart-JS-Datei, die wie in der Fehlerbehebung unter https://nodemailer.com/smtp/oauth2/ vorgeschlagen bereitgestellt wird
  3. Nachdem Sie die Schritte in (2) ausgeführt haben, enthält die generierte JSON-Datei die Attribute acessToken, refreshToken und expires, die in den Attributen erforderlich sind. OAuth2 Beispiele für Nodemailer

Auf diese Weise können Sie die OAuth2-Authentifizierung wie folgt verwenden

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

anstatt Ihr Google Mail-Passwort im Klartext zu speichern und die Sicherheit Ihres Kontos zu verringern.

16
ironicaldiction

ich habe nur meine Domain auf smtp.gmail.com gesetzt und es funktioniert. Ich verwende ein VPS-Vultr. 

der 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);
});

meine EJS-Vorlage (E-Mail.EJS):

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

Stelle sicher:

einen schönen Tag noch ;)

Sie benötigen das App-Passwort nur für Google Auth und ersetzen Sie dann Ihr Google-Passwort in Ihrem Code. gehen Sie hier https://myaccount.google.com/apppasswords

beispielcode: 

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

Für Debugging-Zwecke ist es praktisch, eine Callback-Funktion zu implementieren (diese Funktion wird auf der Nodemailer-Github-Seite nicht ausgeführt), die die Fehlernachricht anzeigt (falls vorhanden). 

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

Es hat mir geholfen, mein Problem zu lösen ... Stellt sich heraus, dass neuere Versionen nicht richtig funktionieren: 

"Sieht aus, als hätte nodemailer 1.0 brechende Änderungen, so dass stattdessen 0.7 verwendet werden muss: http://www.nodemailer.com/

Nachricht auf nodemailer veröffentlicht am 17.12.15:

Aktualisieren Sie Nodemailer nicht von 0.7 oder niedriger auf 1.0, da dies zu durchbrechenden Änderungen führt. Sie können den 0.7-Zweig so lange verwenden, wie Sie möchten. Siehe die Dokumentation für 0.7 hier . "

Ich habe diese Antwort gefunden hier

2
Maarten Meeusen

Während die obigen Antworten funktionieren, möchte ich darauf hinweisen, dass Sie die Sicherheit von Google Mail durch die folgenden ZWEI - Schritte verringern können.

SCHRITT 1

Google-Konto: Anmeldeversuch blockiert Wenn dies der Fall war Sie können zu einer von Google erstellten App wie Google Mail wechseln, um auf Ihr Konto zuzugreifen (empfohlen), oder ändern Sie Ihre Einstellungen unter https://www.google.com/settings/security/lesssecureapps , damit Ihr Konto nicht mehr durch moderne Sicherheitsstandards geschützt ist.

SCHRITT 2

Zusätzlich zum Aktivieren der Option "Weniger sichere Apps zulassen" müssen Sie möglicherweise auch zu https://accounts.google.com/DisplayUnlockCaptcha navigieren und auf "Weiter" klicken.

1
Ahmad Awais

probieren Sie diesen Code für mich aus.

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');

Antwort:  

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

Und installieren Sie das SMTP-Modul als Abhängigkeit:

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

Gehen Sie zu https://myaccount.google.com/lesssecureapps Und ändern Sie BEI, weil Das macht Ihr Konto anfälliger. Sie können den Zugriff für diese von uns empfohlenen Apps ausschalten oder den Zugriff aktivieren, wenn Sie sie trotz der Risiken verwenden möchten. 

0
Azran Khan