Fehlende Anmeldeinformationen für “PLAIN”-Nodemailer

Lesezeit: 6 Minuten

Ich versuche, Nodemailer in meinem Kontaktformular zu verwenden, um Feedback zu erhalten und es direkt an eine E-Mail zu senden. Dies ist das untenstehende Formular.

<form method="post" action="/contact">
      <label for="name">Name:</label>
      <input type="text" name="name" placeholder="Enter Your Name" required><br>
      <label for="email">Email:</label>
      <input type="email" name="email" placeholder="Enter Your Email" required><br>
      <label for="feedback">Feedback:</label>
      <textarea name="feedback" placeholder="Enter Feedback Here"></textarea><br>
      <input type="submit" name="sumbit" value="Submit">
</form>

So sieht die Anfrage auf der Serverseite aus

app.post('/contact',(req,res)=>{
let transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: '[email protected]',
        password: 'password'
    }
});
var mailOptions = {
    from: req.body.name + '&lt;' + req.body.email + '&gt;',
    to: '[email protected]',
    subject: 'Plbants Feedback',
    text: req.body.feedback 
};
transporter.sendMail(mailOptions,(err,res)=>{
    if(err){
        console.log(err);
    }
    else {

    }
});

Ich bekomme den Fehler Missing credentials for "PLAIN". Jede Hilfe ist willkommen, vielen Dank.

Du hast

auth: {
    user: '[email protected]',
    password: 'password'
}

Aber das solltest du schreiben

auth: {
    user: '[email protected]',
    pass: 'password'
}

Benennen Sie einfach das Passwort um, um es zu übergeben.

  • du verdienst einen aaward! das hat mich gerettet danke

    – Techcheese

    11. September 2021 um 4:30 Uhr

  • Einfach und direkt, Lebensretter. Benennen Sie einfach das Passwort um, um es zu übergeben. löst dies. Möglicherweise haben Sie das Passwort versehentlich geschrieben, anstatt es einfach zu passieren

    – Gotteszeit

    29. September 2021 um 13:36 Uhr

Benutzer-Avatar
der große Heuchler

Ich konnte dieses Problem lösen, indem ich Nummer 3, 3LO-Authentifizierung einrichten, Beispiel aus der Nodemailer-Dokumentation (Link: https://nodemailer.com/smtp/oauth2/). Mein Code sieht so aus:

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: '[email protected]',
        clientId: '000000000000-xxx0.apps.googleusercontent.com',
        clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
        refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'
    }
});

Wenn Sie sich das Beispiel in dem oben angegebenen Link angesehen haben, können Sie dort sehen, dass es eine ‘Expires’-Eigenschaft gibt, aber in meinem Code habe ich sie nicht eingefügt und es funktioniert immer noch gut.

Um clientId, clientSecret, refreshToken und accessToken abzurufen, habe ich mir gerade dieses Video angesehen https://www.youtube.com/watch?v=JJ44WA_eV8E .

Ich weiß nicht, ob das noch hilfreich für dich ist.

Der E-Mail-Dienst Gmail/Google App erfordert OAuth2 für die Authentifizierung. Das PLAIN-Text-Passwort erfordert das manuelle Deaktivieren von Sicherheitsfunktionen im Google-Konto.

Um OAuth2 in Nodemailer zu verwenden, siehe: https://nodemailer.com/smtp/oauth2/

Beispielcode:

var email_smtp = nodemailer.createTransport({      
  host: "smtp.gmail.com",
  auth: {
    type: "OAuth2",
    user: "[email protected]",
    clientId: "CLIENT_ID_HERE",
    clientSecret: "CLIENT_SECRET_HERE",
    refreshToken: "REFRESH_TOKEN_HERE"                              
  }
});

Und wenn Sie immer noch nur ein Nur-Text-Passwort verwenden möchten, deaktivieren Sie die sichere Anmeldung in Ihrem Google-Konto und verwenden Sie es wie folgt:

var email_smtp = nodemailer.createTransport({      
  host: "smtp.gmail.com",
  auth: {
    type: "login", // default
    user: "[email protected]",
    pass: "PASSWORD_HERE"
  }
});

  • Frühere Versionen von Nodemailer (nicht sicher, welche Version) erforderten die Verwendung von xoauth2.createXOAuth2Generator, um OAuth2 zu handhaben. Es ist nicht mehr erforderlich.

    – Jeffrey Roshan

    22. Februar 2018 um 10:22 Uhr

Dafür müssen wir unsere Google-Kontosicherheit nicht herabsetzen. Dies funktioniert für mich auf Localhost und Live-Server. Versionen: Knoten 12.18.4Nodemailer ^6.4.11.

SCHRITT 1: Folgen Sie der Einrichtung Ihres Google Api-Zugriffs in diesem Video UND IGNIEREN Sie seinen Code (er hat bei mir nicht funktioniert): https://www.youtube.com/watch?v=JJ44WA_eV8E

SCHRITT 2: Probieren Sie diesen Code in Ihrer Haupt-App-Datei aus, nachdem Sie nodemailer und dotenv via installiert haben npm i nodemailer dotenv:

    require('dotenv').config();  //import and config dotenv to use .env file for secrets
    const nodemailer = require('nodemailer');

    function sendMessage() {
      try {
        // mail options
        const mailOptions = {
          from: "[email protected]",
          to: "[email protected]",
          subject: "Hey there!",
          text: "Whoa! It freakin works now."
        };
        // here we actually send it
        transporter.sendMail(mailOptions, function(err, info) {
          if (err) {
            console.log("Error sending message: " + err);
          } else {
            // no errors, it worked
            console.log("Message sent succesfully.");
          }
        });
      } catch (error) {
        console.log("Other error sending message: " + error);
      }
    }

    // thats the key part, without all these it didn't work for me
    let transporter = nodemailer.createTransport({
      host: 'smtp.gmail.com',
      port: 465,
      secure: true,
      service: 'gmail',
      auth: {
            type: "OAUTH2",
            user: process.env.GMAIL_USERNAME,  //set these in your .env file
            clientId: process.env.OAUTH_CLIENT_ID,
            clientSecret: process.env.OAUTH_CLIENT_SECRET,
            refreshToken: process.env.OAUTH_REFRESH_TOKEN,
            accessToken: process.env.OAUTH_ACCESS_TOKEN,
            expires: 3599
      }
    });

    // invoke sending function
    sendMessage();

Dein .env Datei für den obigen Code sollte ungefähr so ​​​​aussehen:

[email protected]
GMAIL_PASSWORD=lakjrfnk;wrh2poir2039r
OAUTH_CLIENT_ID=vfo9u2o435uk2jjfvlfdkpg284u3.apps.googleusercontent.com
OAUTH_CLIENT_SECRET=og029503irgier0oifwori
OAUTH_REFRESH_TOKEN=2093402i3jflj;geijgp039485puihsg[-9a[3;wjenjk,ucv[3485p0o485uyr;ifasjsdo283wefwf345w]fw2984329oshfsh
OAUTH_ACCESS_TOKEN=owiejfw84u92873598yiuhvsldiis9er0235983isudhfdosudv3k798qlk3j4094too283982fs

Für mich war das Problem, dass ich nicht richtig auf die Variablen der .env-Datei zugegriffen habe (ich nehme an, Sie speichern Ihre E-Mail-Adresse und Ihr Passwort auch in einer .env-Datei). Ich musste dies am Anfang der Datei hinzufügen:

const dotenv = require('dotenv');
dotenv.config();

Sobald ich das getan hatte, konnte ich den “Auth”-Teil der Anmeldeinformationen wie folgt ausfüllen:

auth: {
  user: process.env.EMAIL_USERNAME,
  pass: process.env.EMAIL_PASSWORD
}

Natürlich müssen Sie EMAIL_USERNAME und EMAIL_PASSWORD durch den Namen dieser Variablen in Ihrer .env-Datei ersetzen.

Benutzer-Avatar
NITESH HEBBARE

Bei mir ist es passiert, weil ich es vergessen habe npm installiere dotenv und require(‘dotenv’).config();

Benutzer-Avatar
Steve B

Ich bin auf dieses Problem gestoßen, als ich meine App in Heroku bereitgestellt habe. Ich habe E-Mails lokal gut versendet, aber als ich einen neuen Build zu Heroku gepusht habe, habe ich das Gefürchtete bekommen Missing credentials for "PLAIN" Error. Mein Problem war, dass ich die .env-Variablen in Heroku nicht separat eingerichtet hatte.

Wenn Sie in Heroku zu Ihrem Dashboard gehen, können Sie die Konfigurationsvariablen manuell einrichten, und das hat das Problem für mich gelöst.

Oder Sie können dies über Heroku CLI tun – gut Anleitung hier

Heroku Dashoard

  • Das ist mein Problem! Danke, dass du mich vor Tagen der Verwirrung bewahrt hast.

    – Jason Huang

    23. April um 20:44 Uhr

1015930cookie-checkFehlende Anmeldeinformationen für “PLAIN”-Nodemailer

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy