微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有电子邮件模板的 Nodemailer 在本地工作但不在 AWS Lambda 环境中

如何解决带有电子邮件模板的 Nodemailer 在本地工作但不在 AWS Lambda 环境中

我正在开发一个具有用户帐户的小型网络应用程序。所以我想发送关于他们的注册和电子邮件地址确认的电子邮件

我将无服务器框架与 Express 和 Node.js 以及 Nodemailer 与电子邮件模板一起使用。

这是发送确认电子邮件的 mailer.js 函数

function sendConfirmation (name,address) {
    const transporter = nodemailer.createTransport({
        host: 'smtp.strato.de',port: 465,secure: true,auth: {
            user: process.env.STRATO_USER,pass: process.env.STRATO_PASSWORD,}
    });

    const email = new Email({
        transport: transporter,send: true,preview: false,});

    console.log("Sending Email");

    email.send({
        template: 'confirmation',message: {
            from: 'company',to: address,},locals: {
            fname: name,}
    }).then(() => console.log('email has been sent!'));

}

module.exports = {
    sendRegister,sendConfirmation
};

这是路线的代码。我在数据库中查找用户并更新他以进行确认。然后我尝试发送电子邮件

router.post("/confirmation",async (req,res) => {
  userId = req.body.userId;
  let userUpdated = false;
  let updatedUser;
  updatedUser = await User.findByIdAndUpdate({_id: userId},{"confirmed": true},function (err,result) {
    if(err){
      res.send(err)
    }
    else{
      userUpdated = true;
    }
  });

  if (userUpdated) {
    await sendConfirmation(updatedUser.name,updatedUser.email);
    res.json({error: null,data: "User confirmed"});
  }

});

如果我在本地主机上用 app.listen 测试这个,我会毫无问题地收到电子邮件。一旦我使用无服务器将其部署到 AWS,用户就会在数据库中更新,但不会发送电子邮件。貌似 Lambda 没有等到 email.send() 的 promise 出现了?我还尝试明确允许 Lambda 函数在出站流量上与端口 465 进行通信。没有运气。

在 Lambda 函数的日志中没有显示错误,也没有确认发送的电子邮件

有谁知道我错过了什么?非常感谢!

编辑 1:

我刚刚发现,如果我使用带有相应函数await sleep(2000)

  return new Promise((resolve) => {
    setTimeout(resolve,ms);
  });
}

调用 sendConfirmation 函数之后就可以正常工作了。看来,sendConfirmation 函数不会等待 email.send 的承诺。知道如何解决这个问题吗?我对 Promise 还很陌生。

提前致谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。