Nodemailer: 4 письма свыше 8 отправляются с пустым телом - PullRequest
0 голосов
/ 01 февраля 2019

Я создаю веб-приложение для управления курсами.У меня есть mongodb со всеми моими выпускниками, их электронной почтой и регистрационным идентификатором.Я хочу отправить идентификатор на их почту.У меня есть шаблон 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 раза я получил без тела.

1 Ответ

0 голосов
/ 01 февраля 2019

Код под вашим вызовом fs.readFile не предоставляется как часть обратного вызова этой функции.По сути, чтение файла начинается, а остальная часть кода начинает выполняться, что приводит к гонке за создание html_template до отправки электронного письма.

Два решения:

  1. Расширьте функцию обратного вызова, чтобы включить остальную часть кода.Это будет предпочтительный метод, поскольку он не блокирует и, таким образом, позволяет вашему приложению продолжать обслуживать другие запросы.
  2. Используйте fs.readFileSync, синхронный эквивалент.

Кроме того, поскольку вы используете async / await, вы также можете просто let data = await fs.readFile("path/to/file");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...