缺少“PLAIN”节点制作者的凭据

时间:2018-02-18 16:42:31

标签: javascript node.js server scripting nodemailer

我正在尝试在联系表单中使用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 + '&lt;' + req.body.email + '&gt;',
    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"。感谢任何帮助,非常感谢。

12 个答案:

答案 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_EMAILprocess.env.GMAIL_PASS

当我使用.env在目录中运行它时,

答案 9 :(得分:0)

我在将我的应用程序部署到 Heroku 时遇到了这个问题。我在本地发送电子邮件很好,但是当我将新版本推送到 Heroku 时,我收到了可怕的 Missing credentials for "PLAIN" 错误。我的问题是我没有在 Heroku 中单独设置 .env 变量。

如果您转到 Heroku 中的仪表板,您可以手动设置配置变量,这为我解决了问题。

或者你可以通过 Heroku CLI 来做 - 好 tutorial here

Heroku Dashoard

答案 10 :(得分:-1)

我遇到了同样的问题,是谷歌自动屏蔽了你的登录表单不真实的第三方软件造成的。然后,您可以在 Google 帐户管理中关闭此功能。

问候,

答案 11 :(得分:-2)

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