node.js - 使用 Async/Await 的 Nodemailer 电子邮件确认

标签 node.js promise async-await nodemailer

我正在使用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/

相关文章:

javascript - 帖子回复没有得到?

node.js - npm 安装报错 EPERM Operation not permitted

javascript - Discord 机器人没有获得所有用户

javascript - 使用promisefiy all时出错

javascript - 异步/等待返回 Promise { <pending> }

node.js - gulp-eslint 在控制台上未显示任何错误

javascript - 使用 Q (promise) 的 Node.js 上的变量上下文问题

javascript - 如何使用 Bluebird 错误处理程序?

javascript - “异步”Azure Function App 未按预期等待

c# - 为什么单独的方法调用被认为是同一个任务?