Nodemailer: 4 письма из 8 отправляются с пустым телом

Я создаю веб-приложение для управления курсами. У меня есть mongodb со всеми моими выпускниками, их электронной почтой и их регистрационным идентификатором. Я хочу отправить id на их почту. У меня есть шаблон html, а затем с помощью функций fs.readfile и .replace() я заменяю заполнители реальной информацией, которую хочу отправить.

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

  console.info(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: "[email protected] ", // generated ethereal user
      pass: "mypw" // generated ethereal password
    }
  });
  // setup email data with unicode symbols
  let mailOptions = {
    from: '"Cogestione Moscati" <[email protected]>', // 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.info("Message sent: %s", info.messageId);
}

Проблема в том, что я отправил 8 раз одно и то же письмо. 4 раза я получил правильно, 4 раза я получил без тела.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
564
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Два решения:

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

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

let html_template = await fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,‌​data)=>{ return data.toString().replace("XYZXYZXYZ",idreg).replace("XX /YY/ZZ‌​ZZ",dataReg).replace‌​("XX:YY",oraReg); });

Francesco Buccoliero 01.02.2019 19:03

редактировать. Я понял, что вы имели в виду под «Расширить обратный вызов». отлично работает. Это не ошибка, которую я обычно делаю, потому что я вручную пишу код. В этом случае я скопировал из документов. Спасибо чувак! @том-марш

Francesco Buccoliero 01.02.2019 21:24

Другие вопросы по теме