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 + '<' + req.body.email + '>',
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.

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"
}
});
Dafür müssen wir unsere Google-Kontosicherheit nicht herabsetzen. Dies funktioniert für mich auf Localhost und Live-Server. Versionen: Knoten 12.18.4
Nodemailer ^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.

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

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

10159300cookie-checkFehlende Anmeldeinformationen für “PLAIN”-Nodemaileryes