Nodemailer mit Google Mail und NodeJS


110

Ich versuche, nodemailer zu verwenden, um ein Kontaktformular mit NodeJS zu implementieren, aber es funktioniert nur auf lokaler Ebene, es funktioniert nicht auf einem Remote-Server ...

Meine Fehlermeldung:

[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' }

Mein Controller:

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

14
google.com/accounts/DisplayUnlockCaptcha (zur besseren Sichtbarkeit unten von einem guten Kommentator gepostet). Erlaube einfach den Zugriff einmal und lass den Nodemailer sich automatisch anmelden.
Laggingreflex

3
Nachdem ich alles versucht hatte, um mit nodemailer E-Mails über Google Mail zu senden, funktionierte die folgende Einstellung für mich.
faizanjehangir

Antworten:


136

Ich habe dieses Problem gelöst, indem ich zur folgenden URL gegangen bin (während ich mit dem Konto, von dem ich E-Mails senden möchte, mit Google verbunden bin):

https://www.google.com/settings/security/lesssecureapps

Dort habe ich weniger sichere Apps aktiviert.

Getan


1
Gut gemacht! es funktioniert, obwohl ich nicht denke, dass es die beste Idee ist ... Ich habe meine erste E-
Mail erhalten

Ohne dies zu aktivieren, funktioniert es nicht einmal in der lokalen Umgebung. Er erwähnte deutlich, dass es in einer lokalen Umgebung funktioniert und nicht auf einem Remote-Server. Was ist die Lösung für das?
Adithya Sai

Dies kann Ihnen nicht helfen, wenn Sie 2FA Auth in Ihrem Google Mail-Konto haben
Sasha Romanov

63

Siehe den offiziellen Leitfaden von nodemailer zum Verbinden von Google Mail:

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

- -

Danach funktioniert es für mich:

  1. Aktivieren Sie weniger sichere Apps - https://www.google.com/settings/security/lesssecureapps
  2. Deaktivieren Sie Captcha vorübergehend, damit Sie eine Verbindung zum neuen Gerät / Server herstellen können - https://accounts.google.com/b/0/displayunlockcaptcha

18
Nummer 2 hat meine Probleme gelöst. Ich konnte diesen Link nirgendwo in den Kontoeinstellungen von Google finden. Danke dir!
Programmstinator

1
Hier gilt das gleiche. Ich habe zuvor # 1 gemacht und E-Mails auf localhost erhalten, bin zur Produktion übergegangen und nichts hat funktioniert. # 2 hat mein Problem für die Produktion behoben. Vielen Dank
John

49

Einfache Lösung:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: 'somerealemail@gmail.com',
  to: 'friendsgmailacc@gmail.com',
  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);
  }
});  

Schritt 1:

Gehen Sie hier https://myaccount.google.com/lesssecureapps und aktivieren Sie weniger sichere Apps. Wenn dies nicht funktioniert, dann

Schritt 2

Gehen Sie hier https://accounts.google.com/DisplayUnlockCaptcha und aktivieren / fahren Sie fort und versuchen Sie es dann.

Für mich hat Schritt 1 alleine nicht funktioniert, also musste ich zu Schritt 2 gehen.

Ich habe auch versucht, das Nodemailer-SMTP-Transport-Paket zu entfernen, und zu meiner Überraschung funktioniert es. Aber als ich mein System neu startete, gab es den gleichen Fehler, also musste ich die weniger sichere App einschalten (ich habe sie nach meiner Arbeit deaktiviert).

dann habe ich es zum spaß einfach mit off (weniger sichere app) ausprobiert und vola es hat wieder funktioniert!


1
Schritt 1 und 2 waren sehr hilfreich. Danke! Ich habe Schritt 1 ausprobiert, bevor ich Ihre Lösung gesehen habe und habe nicht funktioniert, aber mit Schritt 2 ist es eine Magie!
MissStack

"smptTransport ist keine Funktion"
JWiley

Ich habe es mit beiden Methoden versucht, die Sie mit uns geteilt haben, aber ich erhalte immer wieder den gleichen Fehler. ETIMEDOUT ', Code:' ECONNECTION ', Systemaufruf:' connect ', Adresse: '74 .125.68.108', Port: 465, Befehl: 'CONN'}
Anwar Hussain

@AnwarHussain: Ich bekomme auch wieder den gleichen Fehler
Pappa S

42

Sie sollten ein XOAuth2-Token verwenden , um eine Verbindung zu Google Mail herzustellen . Keine Sorge, Nodemailer weiß das schon:

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

Sie müssen zur Google Cloud Console gehen , um Ihre App zu registrieren. Anschließend müssen Sie Zugriffstoken für die Konten abrufen, die Sie verwenden möchten. Sie können dafür passportjs verwenden .

So sieht es in meinem Code aus:

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

9
Gibt es eine einfachere Lösung, um eine E-Mail in NodeJS mit einem GMail-Konto zu senden?
Tonymx227


Können Sie erklären, was passport.authorize tut und warum Sie Scope, Callbackurl und dergleichen benötigen? Warum können Sie dies nicht einfach mit clientId & secret tun?
Ismail

passport.authorizeähnelt dem Beispiel, passport.authenticatedass nicht versucht wird, die aktuelle Sitzung zu aktualisieren. Sie müssen bestehen, callbackURLda Google nach dem OAuth-Handshake wissen muss, wo der Nutzer umgeleitet werden muss, damit der Handshake abgeschlossen wird.
Laurent Perrin


14

Hat gut funktioniert:

1- Nodemailer installieren , Paket falls nicht installiert ( cmd eingeben ):npm install nodemailer

2- Gehen Sie zu https://myaccount.google.com/lesssecureapps und aktivieren Sie Weniger sichere Apps zulassen .

3- Code schreiben:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'trueUsername@gmail.com',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: 'any@any.com', // sender address
    to: 'true@true.com', // 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- viel Spaß!


11

Das gleiche Problem ist mir auch passiert. Ich habe mein System auf localhost getestet und dann auf dem Server (der sich in einem anderen Land befindet) bereitgestellt. Als ich das System auf einem Produktionsserver ausprobierte, sah ich diesen Fehler. Ich habe versucht, dies zu beheben:

  1. https://www.google.com/settings/security/lesssecureapps Aktiviert, aber es war nicht meine Lösung
  2. https://g.co/allowaccess Ich habe für eine begrenzte Zeit den Zugriff von außen zugelassen und dies hat mein Problem gelöst.

2
Der Link g.co/allowaccess hat das Problem für mich behoben (hatte bereits weniger sichere Anwendungen aktiviert) - danke!

10

Ich arbeite auf diese Weise mit Port und Sicherheit (ich hatte Probleme beim Senden von E-Mails aus Google Mail mit PHP ohne Sicherheitseinstellungen).

Ich hoffe, jemand wird helfen.

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: 'xxxx@gmail.com', // sender address
    to: 'yyyy@gmail.com', // 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);
}

Alle Konfigurationen sind hier aufgelistet (einschließlich Beispiele).


10

Keine der oben genannten Lösungen hat bei mir funktioniert. Ich habe den Code verwendet, der in der Dokumentation von NodeMailer vorhanden ist . Es sieht aus wie das:

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: 'user@example.com',
        serviceClient: '113600000000000000000',
        privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
}); 

Danke Kumpel ! :) thissss ---> host: 'smtp.gmail.com', port: 465, sicher: true, arbeitete für mich
Praveen Vishnu

@PraveenVishnu Kein Problem, wenn Sie diese Antwort abstimmen, werden mehr Leute sie sehen. Es könnte ihnen auch helfen.
Hamid

Hallo, ich weiß, dass dies bereits ein altes ist, aber würde es Ihnen etwas ausmachen, woher Sie serviceClient, privateKey und accessToken haben? Danke dir.
Aljohn Yamaro

@AljohnYamaro Der Mail-Service wird es bereitstellen. In meinem Fall war es Google Mail. Sie können hier mehr lesen: stackoverflow.com/questions/36214968/…
Hamid


9

Ich fand, dass die einfachste Methode, die in diesem Artikel in Greg Ts Antwort beschrieben wird , darin bestand, ein App-Passwort zu erstellen, das nach dem Aktivieren von 2FA für das Konto verfügbar ist.

myaccount.google.com> Anmelden & Sicherheit> Anmelden bei Google> App-Passwörter

Dadurch erhalten Sie ein alternatives Kennwort für das Konto. Anschließend konfigurieren Sie nodemailer einfach als normalen SMTP-Dienst.

var smtpTransport = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "username@gmail.com",
        pass: "app password"
    }
});

Obwohl Google Oauth2 als beste Option empfiehlt, ist diese Methode einfach und wurde in dieser Frage noch nicht erwähnt.

Zusätzlicher Tipp: Ich habe auch festgestellt, dass Sie Ihren App-Namen zur "Von" -Adresse hinzufügen können und GMail ihn nicht nur durch die Konto-E-Mail ersetzt, wie dies der Fall ist, wenn Sie versuchen, eine andere Adresse zu verwenden. dh.

from: 'My Pro App Name <username@gmail.com>'

Immer verwenden1. Sie müssen die 2-Factory-Authentifizierung festlegen, um das App-Kennwort festzulegen. Gegenüber auf weniger sicher.
gdfgdfg

8

Es wird mithilfe des nodemailer-smtp-transportModuls in createTransport behoben.

var smtpTransport = require('nodemailer-smtp-transport');

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));

4

Wenn Sie Express verwenden, express-mailerverpackt es sich nodemailersehr gut und ist sehr einfach zu bedienen:

//# 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>

4

Ihr gesamter Code ist in Ordnung, nur die verbleibenden Dinge gehen Sie einfach zum Link https://myaccount.google.com/security

Wenn Sie weiter nach unten scrollen, werden Sie feststellen, dass weniger sichere Apps zulässig sind: EIN und weiter EIN, Sie werden keinen Fehler finden.



4

Aus irgendeinem Grund funktionierte es nicht einmal für mich, selbst eine weniger sichere App-Konfiguration zuzulassen. Ich musste einen weiteren Schritt ausführen, der die IMAP-Konfiguration aktiviert:

Auf der Google-Hilfeseite: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • Klicken Sie oben rechts auf Einstellungen Einstellungen.
  • Klicken Sie auf Einstellungen.
  • Klicken Sie auf die Registerkarte Weiterleitung und POP / IMAP.
  • Wählen Sie im Abschnitt "IMAP-Zugriff" die Option IMAP aktivieren aus.
  • Klicken Sie auf Änderungen speichern.

3
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: "mail@from.com",
  to: to,
  subject: subject,
  html: HTML
}
  , function (err, responseStatus) {
      if(responseStatus)
    console.log("checking dta", responseStatus.message);
    callback(err, responseStatus)
  });
});
}

Sie müssen den SecureConnection-Typ in Ihren Code einfügen.


2

Ich habe eine alte Version von nodemailer 0.4.1 verwendet und hatte dieses Problem. Ich habe auf 0.5.15 aktualisiert und jetzt funktioniert alles einwandfrei.

Package package.json, um Änderungen dann widerzuspiegeln

npm install

3
Für diesen Fall ist es besser, ein npm-Update durchzuführen . Wenn Sie mehr darüber erfahren möchten, wie sich npm update und npm install unterscheiden - dann lesen
Anthony Akentiev

2

Nehmen Sie einfach an diesen teil: 1- Die Google Mail-Authentifizierung für das Zulassen von E-Mails auf niedriger Ebene wird nicht akzeptiert, bevor Sie Ihren Client-Browser neu starten. 2- Wenn Sie E-Mails mit nodemailer senden möchten und dort kein xouath2-Protokoll verwenden möchten, sollten Sie als sichere Verbindung schreiben: false wie unten

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: 'from@gmail.com',
      to:'to@gmail.com',
      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;

smtpTransport wird zweimal verwendet, welches ist was?
Biranchi

Wirklich, es ist sehr klar. Das erste ist das Erstellen von smtpTransport-Einstellungen und das zweite zum Senden von E-Mails, indem diese Einstellungen verwendet werden. Es funktioniert heutzutage perfekt in Firebase
Hamit YILDIRIM

2

Installieren Sie zuerst den Nodemailer

npm install nodemailer  --save

in js Datei importieren

const nodemailer = require("nodemailer");

const smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "example@gmail.com",
        pass: "password"
    },
    tls: {
        rejectUnauthorized: false
    }
});






 const mailOptions = {
        from: "example@gmail.com",
        to: sending@gmail.com,
        subject: "Welcome to ",
        text: 'hai send from me'.
    };


    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("mail sent");
        }
    });

in meiner Bewerbung arbeiten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.