Nodemailer 使用服务帐户为 firebase 应用程序发送邮件

Nodemail to send mail for firebase app with service account

我在尝试使用 Nodemailer 发送邮件时收到以下消息:

    '535-5.7.8 Username and Password not accepted. 
    Learn more at\n535 5.7.8  https://support.google.com/mail/?p=BadCredentials y42sm13399804wrc.51 - gsmtp',
  responseCode: 535,
  command: 'AUTH XOAUTH2' }

我正在使用来自 firebase 项目的服务帐户,并已授予对 GMail API 的访问权限。但是 nodemailer docs for 2LO is really scarce 所以我想知道是否有人可以帮助我确定我是否使用了正确的凭据?

user (functions.config().gmail.user) : myfirebaseproject@appspot.gserviceaccount.com

-

function sendContactMail(contactName, contactEmail, contactDate, contactText) {


  // Create transport
  let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: functions.config().gmail.user,
        serviceClient: functions.config().gmail.client_id,
        privateKey: functions.config().gmail.private_key
        //accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        //expires: 1484314697598
    }
  });

  // Mail Options
  let mailOptions = {
    from: `"${APP_NAME}" <${SENDER}>`,
    replyTo: `${contactEmail}`,
    to: 'recipient@gmail.com',
    subject: `Nouveau contact photo de ${contactName}`,
    html: `Nom : ${contactName}<br/>
           Email : ${contactEmail}<br/>
           Date du mariage : ${contactDate}<br/>
           Message : ${contactText}`,
    disableFileAccess: true,
    disableUrlAccess:true
  };

  // Send Mail
  return transporter.sendMail(mailOptions);
}

我有云功能和这段代码,它工作正常。试试这个

mailTransport = nodemailer.createTransport({
  service: 'Gmail',
  auth: {
    user: ${email},
    pass: ${password}
  }
});

您的账户是否启用了两步验证?在这种情况下,在 https://myaccount.google.com/apppasswords 上生成应用密码并使用它代替您的普通密码:

const mailTransport = nodemailer.createTransport(
    `smtps://user@gmail.com:generatedAppPassword@smtp.gmail.com`);