Nodemailer:发送超过 8 封 4 封空邮件

Nodemailer: 4 mail over 8 are sent with empty body

我正在构建一个用于课程管理的管理网络应用程序。我有一个 mongodb,其中包含我所有的校友、他们的电子邮件和他们的注册 ID。我想将 id 发送到他们的邮箱。我有一个 html 模板,然后使用 fs.readfile 和 .replace() 函数将占位符替换为我想发送的真实信息。

async function sendMail(mail,idreg){
  var html_template;
  const dataReg = "12/02/2019";
  const oraReg = "16:00";

  console.log(mail,idreg)

  fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,data)=>{
    html_template = data.toString().replace("XYZXYZXYZ",idreg).replace("XX/YY/ZZZZ",dataReg).replace("XX:YY",oraReg);
  });
  // Generate test SMTP service account from ethereal.email
  // Only needed if you don't have a real mail account for testing
  let account = await nodemailer.createTestAccount();

  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: {
      user: "mymail@gmail.com ", // generated ethereal user
      pass: "mypw" // generated ethereal password
    }
  });
  // setup email data with unicode symbols
  let mailOptions = {
    from: '"Cogestione Moscati" <mymail@gmail.com>', // sender address
    to: mail, // list of receivers
    subject: "Il tuo codice di registrazione per la Cogestione", // Subject line
    html: html_template // html body
  };
  // send mail with defined transport object
  let info = await transporter.sendMail(mailOptions)

  console.log("Message sent: %s", info.messageId);
}

问题是我发送了 8 次相同的邮件。 4次我正确接收,4次我没有收到。

您对 fs.readFile 的调用下方的代码未作为该函数回调的一部分提供。基本上,文件读取开始,其余代码开始执行,导致在发送电子邮件之前争先创建 html_template

两种解决方案:

  1. 扩展回调以包括其余代码。这将是首选方法,因为它是非阻塞的,因此允许您的应用程序继续为其他请求提供服务。
  2. 使用fs.readFileSync,同步等价物。

此外,由于您使用的是 async/await,您也可以 let data = await fs.readFile("path/to/file");