使用 Async/Await 的 Nodemailer 电子邮件确认 [英] Nodemailer email confirmation using Async/Await
问题描述
我正在使用 nodemailer 发送邮件.我需要知道邮件是否已发送,然后更新我的数据库,但邮件是在传输器中发送的(我认为它不会返回承诺),这需要时间,因此即使发送了邮件,返回也总是错误的.
I am sending mails using nodemailer. I need to know if the mail is sent or not and then update my database but the mail is sent in the transporter(which I do not think returns promises) which takes time and hence the return is always false, even if the mail is sent.
这是我从其他路由调用的邮件发送文件
This is my mail sending file which I call from other routes
//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;
这是我称之为的路线:
//imports including the mail_file.js
//somepath.js
router.post('/somepath',(req,res,next)=>{
sendresetmail=async()=>
{
parameters={
//some email parameters
}
return await sendmail(params);
}
sendmail()
.then(response=>{
//response is always false even when the mail is sent
})
.catch(err=>{
//error
})
})
当我记录邮件信息时,是在somepath.js中记录sendmail函数的响应之后
When I log the info of the mail, it is after the logging of the response of the sendmail function in the somepath.js
推荐答案
transporter.sendMail 不返回承诺,它使用回调函数.更改代码
transporter.sendMail does not return a promise, it uses a callback function. change your code
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() 函数使用回调,这就是为什么你不能在那里使用 await.但是你可以围绕它编写一个包装函数,这样你就可以在你需要更多可读性的函数中使用 await干净的代码.只考虑下面的例子
as I said earlier, transport.sendMail() function uses call back that's why you can not use await there.But you can write a wrapper function around it so that you can use await in your functions where you need more readble and clean code. just consider the following example
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函数了,
Now you can use this wrappedSendMail function in your other functions like below,
sendmail= async(req)=>{
var mailOptions = {
//mailoptions
};
let resp= await wrapedSendMail(mailOptions);
// log or process resp;
return resp;
}
这篇关于使用 Async/Await 的 Nodemailer 电子邮件确认的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!