我正在使用nodemailer发送邮件。我需要知道邮件是否已发送,然后更新我的数据库,但邮件是在传输器中发送的(我认为不会返回 promise ),这需要时间,因此返回总是错误的,即使邮件已发送.
这是我从其他路由调用的邮件发送文件
// mail_file.js
// imports
sendmail = async (req) => {
let transporter = nodemailer.createTransport({
// settings
});
var mailOptions = {
// mailoptions
};
let resp = false;
await transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log('error is ' + error);
resp = false;
} else {
console.log('Email sent: ' + info.response);
resp = true;
}
});
return resp;
};
module.exports = sendmail;
当我记录邮件信息时,它是在 somepath.js 中记录 sendmail 函数的响应之后
最佳答案
Nodemailer v6.4.8 支持同步版本和异步版本的 sendMail.sendMail(mailOptions: Mail.Options, callback: (err: Error | null, info: SentMessageInfo) => void): void; sendMail(mailOptions: Mail.Options): Promise;
这个答案仍然可以帮助那些需要了解如何 promise 使用回调的函数的人。链接解释相同内容的文章 https://letsdqode.blogspot.com/2022/01/using-callbacks-with-async-await-or.html
原答案: Transporter.sendMail 不返回 promise ,它使用回调函数。更改您的代码
return new Promise((resolve,reject)=>{
let transporter = nodemailer.createTransport({
//settings
});
var mailOptions = {
//mailoptions
};
let resp=false;
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log("error is "+error);
resolve(false); // or use rejcet(false) but then you will have to handle errors
}
else {
console.log('Email sent: ' + info.response);
resolve(true);
}
});
})
}
正如我之前所说,transport.sendMail() 函数使用回调,这就是为什么你不能在那里使用 wait 的原因。但是你可以在它周围编写一个包装函数,以便你可以在需要更多可读性和干净的代码。只需考虑以下示例
async function wrapedSendMail(mailOptions){
return new Promise((resolve,reject)=>{
let transporter = nodemailer.createTransport({//settings});
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log("error is "+error);
resolve(false); // or use rejcet(false) but then you will have to handle errors
}
else {
console.log('Email sent: ' + info.response);
resolve(true);
}
});
}
})
现在您可以在其他函数中使用此wrappedSendMail函数,如下所示,
sendmail= async(req)=>{
var mailOptions = {
//mailoptions
};
let resp= await wrapedSendMail(mailOptions);
// log or process resp;
return resp;
}
关于node.js - 使用 Async/Await 的 Nodemailer 电子邮件确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508261/