我正在尝试在联系表单中使用nodemailer来接收反馈并将其直接发送到电子邮件中。这是下面的表格。
<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>
这就是服务器端的请求看起来像
app.post('/contact',(req,res)=>{
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'user@gmail.com',
password: 'password'
}
});
var mailOptions = {
from: req.body.name + '<' + req.body.email + '>',
to: 'bantspl@gmail.com',
subject: 'Plbants Feedback',
text: req.body.feedback
};
transporter.sendMail(mailOptions,(err,res)=>{
if(err){
console.log(err);
}
else {
}
});
我收到错误Missing credentials for "PLAIN"
。感谢任何帮助,非常感谢。
答案 0 :(得分:6)
我能够使用编号3,设置3LO身份验证来解决此问题,例如,来自nodemailer文档(链接:https://nodemailer.com/smtp/oauth2/)。我的代码如下:
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: 'user@example.com',
clientId: '000000000000-xxx0.apps.googleusercontent.com',
clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'
}
});
如果您查看了我上面提到的链接中的示例,则可以看到那里有一个“ expires”属性,但是在我的代码中我没有包含它,它仍然可以正常工作。
要获取clientId,clientSecret,refreshToken和accessToken,我只是看了这段视频https://www.youtube.com/watch?v=JJ44WA_eV8E。
我不知道这对您是否仍然有用。
答案 1 :(得分:3)
Gmail / Google应用电子邮件服务需要OAuth2进行身份验证。 PLAIN文本密码需要在Google帐户上手动禁用安全功能。
要在Nodemailer中使用OAuth2,请参阅:https://nodemailer.com/smtp/oauth2/
示例代码:
var email_smtp = nodemailer.createTransport({
host: "smtp.gmail.com",
auth: {
type: "OAuth2",
user: "youremail@gmail.com",
clientId: "CLIENT_ID_HERE",
clientSecret: "CLIENT_SECRET_HERE",
refreshToken: "REFRESH_TOKEN_HERE"
}
});
如果您仍想使用纯文本密码,请在您的Google帐户中禁用安全登录,并按如下方式使用:
var email_smtp = nodemailer.createTransport({
host: "smtp.gmail.com",
auth: {
type: "login", // default
user: "youremail@gmail.com",
pass: "PASSWORD_HERE"
}
});
答案 2 :(得分:3)
我们不需要为此降低Google帐户安全性。这对我在本地主机和实时服务器上有效。版本:节点12.18.4
,节点邮件程序^6.4.11
。
步骤1: 请在此视频中设置您的Google Api Access,并忽略他的代码(对我而言不起作用):https://www.youtube.com/watch?v=JJ44WA_eV8E
步骤2:
通过npm i nodemailer dotenv
安装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: "MySite@mysite.com",
to: "my_gmail@gmail.com",
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();
您用于以上代码的.env
文件应类似于以下内容:
GMAIL_USERNAME=your_mail@gmail.com
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
答案 3 :(得分:2)
对我来说,问题是我没有正确访问 .env 文件变量(我假设您也将电子邮件和密码存储在 .env 文件中)。我不得不将此添加到文件的顶部:
const dotenv = require('dotenv');
dotenv.config();
一旦我这样做了,我就可以像这样填写凭据的“身份验证”部分:
auth: {
user: process.env.EMAIL_USERNAME,
pass: process.env.EMAIL_PASSWORD
}
当然,您需要将 EMAIL_USERNAME 和 EMAIL_PASSWORD 替换为您在 .env 文件中调用这些变量的任何内容。
答案 4 :(得分:1)
您有
auth: {
user: 'user@gmail.com',
password: 'password'
}
但是你应该写这个
auth: {
user: 'user@gmail.com',
pass: 'password'
}
只需重命名密码即可通过。
答案 5 :(得分:1)
如果您要使用基本身份验证(您当前的配置),您需要通过以下链接激活 less secure app 访问权限,访问您在节点邮件程序站点 here 中所述的 Google 帐户。< /p>
为了更安全,我建议您查看以下两个链接:
注意:如果您要使用第一个链接步骤中的安全方式,您应该修改 auth 属性以添加 type 选项,如下所示:> <块引用>
授权:{
类型:'OAuth2',
用户:process.env.EMAIL,
访问令牌,
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
refresh_token: process.env.REFRESH_TOKEN
}
因为没有明确说明您使用的是 OAuth2 方法,它会向您打印相同的错误(基于我最近使用该链接中编写的代码进行的试验)
答案 6 :(得分:0)
对我来说是因为我忘记将 Gmail密码添加到我的.env文件中。
答案 7 :(得分:0)
对我来说,发生这件事是因为我忘记了 npm install dotenv 和 require('dotenv')。config();
答案 8 :(得分:0)
我在没有.env文件的文件夹中运行ts-node。
因此未定义我的process.env.GMAIL_EMAIL
和process.env.GMAIL_PASS
。
当我使用.env
在目录中运行它时,
答案 9 :(得分:0)
我在将我的应用程序部署到 Heroku 时遇到了这个问题。我在本地发送电子邮件很好,但是当我将新版本推送到 Heroku 时,我收到了可怕的 Missing credentials for "PLAIN"
错误。我的问题是我没有在 Heroku 中单独设置 .env 变量。
如果您转到 Heroku 中的仪表板,您可以手动设置配置变量,这为我解决了问题。
或者你可以通过 Heroku CLI 来做 - 好 tutorial here
答案 10 :(得分:-1)
我遇到了同样的问题,是谷歌自动屏蔽了你的登录表单不真实的第三方软件造成的。然后,您可以在 Google 帐户管理中关闭此功能。
问候,
答案 11 :(得分:-2)
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'abcdefgh@gmail.com',
pass: 'ABCD123456'
}
});