节点邮件错误

Posted

技术标签:

【中文标题】节点邮件错误【英文标题】:Node Mailer Error 【发布时间】:2018-06-21 23:23:39 【问题描述】:

当数据添加到实时数据库时,我在 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)

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

但我已经允许谷歌使用安全性较低的身份验证方法,这应该可以完成这项工作【参考方案2】:

解决了来自本地 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-transportxoauth2,并将 host 添加到 auth

还没有用 Firebase 完成它,这是下一个......希望...... :)

【讨论】:

WRT 2FactorAuth 注意一个有用的功能是应用密码support.google.com/accounts/answer/185833?hl=en【参考方案3】:

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

我对这个确切错误“缺少“PLAIN”的凭据”的解决方案:

在 Firebase 控制台中进行身份验证 点击登录方式 选择谷歌 确保已启用

这解决了我的错误。 (和你一样的代码)

【讨论】:

【参考方案4】:

使用 nodemailer,您必须提供用于发送电子邮件的帐户的电子邮件和密码,Firebase 会为您存储这些信息,因此您不必直接在代码中编写它。 为此,您必须配置 gmail.emailgmail.password Google Cloud 环境变量。

在您的控制台中,在您存储函数/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
 
);

我希望这对你们所有人都有帮助,在我的案例中,它是导致“缺少凭据作为普通错误”的原因

【讨论】:

【参考方案5】:

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

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'));
  

希望这会有所帮助:)

【讨论】:

以上是关于节点邮件错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在Neo4j中创建节点时跳过重复节点

Node-RED 和 nodemailer - 错误:无法验证第一个证书

在结果消息猫鼬节点验证中显示实际错误

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

记一次Redis错误排查经历(redis cluster 节点重启后无限同步问题)

记一次Redis错误排查经历(redis cluster 节点重启后无限同步问题)