如何解决带有电子邮件模板的 Nodemailer 在本地工作但不在 AWS Lambda 环境中
我正在开发一个具有用户帐户的小型网络应用程序。所以我想发送关于他们的注册和电子邮件地址确认的电子邮件。
我将无服务器框架与 Express 和 Node.js 以及 Nodemailer 与电子邮件模板一起使用。
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 举报,一经查实,本站将立刻删除。