缺少“PLAIN”节点邮件程序的凭据

IT技术 javascript node.js server scripting nodemailer
2021-03-07 02:36:12

我正在尝试在我的联系表单中使用 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"任何帮助表示赞赏,非常感谢。

6个回答

你有

auth: {
    user: 'user@gmail.com',
    password: 'password'
}

但是你应该写这个

auth: {
    user: 'user@gmail.com',
    pass: 'password'
}

只需重命名密码即可通过。

简单直接,活的救星。只需重命名密码即可通过。解决这个问题。您可能错误地写了密码而不是仅仅通过
2021-04-24 02:36:12
你值得获奖!这救了我谢谢
2021-05-21 02:36:12

我能够通过使用编号 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'
    }
});

如果您查看我上面提到的链接中的示例,您会看到那里有一个“过期”属性,但在我的代码中我没有包含它,它仍然可以正常工作。

为了获取 clientId、clientSecret、refreshToken 和 accessToken,我刚看了这个视频https://www.youtube.com/watch?v=JJ44WA_eV8E

我不知道这对你是否仍然有帮助。

在这里您会找到一个不错的最新视频:youtube.com/watch?v=-rcRf7yswfM
2021-05-10 02:36:12

Gmail / Google 应用电子邮件服务需要 OAuth2 进行身份验证。纯文本密码需要在 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"
  }
});
以前版本的 Nodemailer(不确定是哪个版本)需要使用 xoauth2.createXOAuth2Generator 来处理 OAuth2。不再需要它。
2021-05-21 02:36:12

我们不需要为此降低我们的 Google 帐户安全性。这在本地主机和实时服务器上对我有用。版本: node 12.18.4, nodemailer ^6.4.11

第 1 步:在此视频中设置您的 Google Api 访问并忽略他的代码(它对我不起作用):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
当您搜索这个简单的解决方案 2 天而您没有找到任何东西时,您就会知道这种感觉。当你在这里发布它时,你会看到上面的 3 个人已经发布了它,而你之前没有看到它!:-P
2021-05-13 02:36:12

对我来说,问题是我没有正确访问 .env 文件变量(我假设您也将电子邮件和密码存储在 .env 文件中)。我不得不将此添加到文件的顶部:

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

一旦我这样做了,我就可以像这样填写凭据的“身份验证”部分:

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

当然,您需要将 EMAIL_USERNAME 和 EMAIL_PASSWORD 替换为您在 .env 文件中调用这些变量的任何内容。