Nodemailer v6.4.8 supports both synchronous version and asynchronous version of sendMail.sendMail(mailOptions: Mail.Options, callback: (err: Error | null, info: SentMessageInfo) => void): void; sendMail(mailOptions: Mail.Options): Promise;
This answer still helps someone who needs to understand how to promisify a function that uses callbacks. Linking an article that explains the same thing
https://letsdqode.blogspot.com/2022/01/using-callbacks-with-async-await-or.html
Original Answer:
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);
}
});
})
}
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);
}
});
}
})
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;
}