节点邮件程序错误

时间:2018-01-12 13:27:21

标签: node.js firebase firebase-realtime-database google-cloud-functions nodemailer

我在Firebase Cloud Functions中使用nodemailer在数据添加到实时数据库时发送邮件。

代码:

const functions = require('firebase-functions');
const nodemailer = require('nodemailer');

const gmailEmail = 'myemail.in@gmail.com';
const gmailPassword = 'mypassword';

const mailTransport = nodemailer.createTransport({
  service: 'gmail',
  auth: {
  user: gmailEmail,
  password: gmailPassword
}
});

const APP_NAME = 'ABC In'

exports.salonCreatedAccount = functions.database.instance('abc-
in').ref('/abc/{def}').onCreate(event => {
const snapshot = event.data;
const val = snapshot.val()
console.log(val);

const email = val.email;
const displayname = val.name;

return sendconfirmationEmail(email, displayname);
});

function sendconfirmationEmail(email, displayName){
const mailOptions = {
  from: `${APP_NAME} <abc.in@gmail.com>`,
  to: email
};

mailOptions.subject = `Welcome to ${APP_NAME}!`;
mailOptions.text = `Some Text`;
return mailTransport.sendMail(mailOptions).then(() => {
  console.log(`New welcome mail sent to ${email}`);
});
}

我在执行时遇到以下错误。 注意:我确保电子邮件和密码是正确的,并且没有错误。

错误:

Error: Missing credentials for "PLAIN"
at SMTPConnection._formatError (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:591:19)
at SMTPConnection.login (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:340:38)
at connection.connect (/user_code/node_modules/nodemailer/lib/smtp-transport/index.js:270:32)
at SMTPConnection.once (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:188:17)
at SMTPConnection.g (events.js:292:16)
at emitNone (events.js:86:13)
at SMTPConnection.emit (events.js:185:7)
at SMTPConnection._actionEHLO (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:1113:14)
at SMTPConnection._processResponse (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:747:20)
at SMTPConnection._onData (/user_code/node_modules/nodemailer/lib/smtp-connection/index.js:543:14)

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

解决了本地nodejs测试应用中出现的相同错误,其中@Zaheen回复了Nodemailer with Gmail and NodeJS ,他的部分回复在此复制:

var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

(使用2FactorAuth的BTW帐户无法启用安全性较低的应用)。
我使用 nodemailer-smpt-transport xoauth2 ,并将 host 添加到 auth {}

尚未使用Firebase完成此操作,接下来......希望......:)

答案 1 :(得分:1)

使用nodemailer,您必须提供发送电子邮件的帐户的电子邮件和密码,Firebase会为您存储,因此您不必直接在代码上写入。 要实现这一点,您必须配置gmail.emailgmail.password Google云环境变量。

在您的控制台中,在您存储函数的路径中/yourProject/functions$以这种方式设置变量:

firebase functions:config:set gmail.email="senderEmail@gmail.com" gmail.password="yourPassword"

然后你可以这样使用它:

const gmailEmail = functions.config().gmail.email;
const gmailPassword = functions.config().gmail.password;
const mailTransport = nodemailer.createTransport({
service: 'gmail',
 auth: {
  user: gmailEmail,
  pass: gmailPassword
 }
});

我希望这对你们所有人都有帮助,这是导致“缺少凭证”错误的原因。在我的情况下

答案 2 :(得分:1)

password对象中将pass重命名为auth。例如

const mailTransport = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: gmailEmail,
    pass: gmailPassword
  }
});

我遇到了同样的问题,并像这样解决了。

nodemailer的代码中潜水发现,该消息的代码如下所示。

  if (this._auth.user && this._auth.pass) { // this condition <---
    this._auth.credentials = {
      user: this._auth.user,
      pass: this._auth.pass
    };
  } else {
    return callback(this._formatError('Missing credentials for "' + this._authMethod + '"', 'EAUTH', false, 'API'));
  }

希望这会有所帮助:)

答案 3 :(得分:0)

根据official docs,GMail可能会在某些特殊情况下禁用基本身份验证。

  

为防止出现登录问题,您应该使用OAuth2或使用其他送货提供商,最好是专用的。

在此处阅读更多内容:https://nodemailer.com/usage/using-gmail/

答案 4 :(得分:0)

我遇到了同样的错误,直到现在才在网上找不到任何解决方案。

我对此确切错误的解决方案&#34;缺少&#34; PLAIN&#34;&#34;

的凭据
  • 转到Firebase控制台中的身份验证
  • 点击登录方式
  • 选择Google
  • 确保已启用

这解决了我的错误。 (与您的代码相同)