首页 > 解决方案 > 使用 Nodemailer 发送多封电子邮件时出现问题 - 主题未更改

问题描述

我正在尝试使用 nodejs 和 nodemailer 发送多封电子邮件,直到现在我尝试了 +50 种方法并且始终得到相同的结果:传输器发送具有不同正文但具有相同主题的电子邮件,

我试图一个一个地发送逻辑函数,我切换到将所有电子邮件有效负载推送到一个数组中,然后调用一个函数来发送它们,它总是相同的:相同的主题(当我做 console.log 我看到 3 个不同的并更正电子邮件对象)。

这是我的代码(书籍是猫鼬模型):

var TypesBook = [
  "Comic",
  "Action",
  "Adventure"
];

sendDailyEmails = () => {

  var emails = []; 

    Books.find({day: stringday}, (err, books) => {
      if (err) {
          console.log("error get books")
      }
      if (!stats) {
          console.log("books not found")
      }
      for (let i=0; i < TypesBook.length; i++) {
        let EmailPayload = {
          from: '',
          to:["test@test.test"],
          subject : "[Book "+TypesBook[i]+"] is availbale at day "+stringday
          }
        for (let j=0; j<books.length; j++) {
          if (TypesBook[i] !== books[j].Type) {
            continue
          } else {
            EmailPayload["html"] =
            'Hi' +
            "Your book "+TypesBook[i]+" is ready <br/><br />" +
            "details: "+books[j].Length.pages+" <br />"

            emails.push(EmailPayload)
          }
        }
      }
      sendMyNewEmails(emails);
  }).catch(err => console.log(err))

};

sendMyNewEmails = (tab) => {
  console.log(tab) // here I get 3 correct objects with correct subject and body
  tab.forEach(function(entry) {
    Email.sendMail(entry);
});
}

sendMail = async (payload) => {

  var mailOptions = {
    from: 'email@email.email',
    to: payload.to,
    subject: payload.subject,
    text: payload.text,
    html: payload.html   
  };

  transporter.sendMail(mailOptions, function(error, info){
    if (error) {
      console.log(error)
    }
  });
}

我把它改成了这个,但仍然是同样的错误:

sendMail = function(mailOptions){

  return new Promise(function (resolve, reject){
     transporter.sendMail(mailOptions, (err, info) => {
        if (err) {
           console.log("error: ", err);
           reject(err);
        } else {
           console.log(`Mail sent successfully!`);
           resolve(info);
        }
     });
  });

}

更新 :

当我在收到的电子邮件中单击电子邮件详细信息时,我看到了正确的主题,但它进入了带有错误旧主题的收件箱(甚至不存在于代码中)。

这里的主题是错误的(所有 3 封电子邮件都带有该主题) 这里有 3 封旧/错误主题的电子邮件

在电子邮件中,主题是正确的: 题目正确

标签: node.jsexpressemailasynchronousnodemailer

解决方案


使用闭包函数调用:

    var TypesBook = [
      "Comic",
      "Action",
      "Adventure"
    ];

    sendDailyEmails = () => {

      var emails = []; 

        Books.find({day: stringday}, (err, books) => {
          if (err) {
              console.log("error get books")
          }
          if (!stats) {
              console.log("books not found")
          }
          for (let i=0; i < TypesBook.length; i++) {

(function(idx){

  let EmailPayload = {
              from: '',
              to:["test@test.test"],
              subject : "[Book "+TypesBook[idx]+"] is availbale at day "+stringday
              }
            for (let j=0; j<books.length; j++) {
              if (TypesBook[idx] !== books[j].Type) {
                continue
              } else {
                EmailPayload["html"] =
                'Hi' +
                "Your book "+TypesBook[idx]+" is ready <br/><br />" +
                "details: "+books[j].Length.pages+" <br />"

                emails.push(EmailPayload)
              }
            }
          }
          sendMyNewEmails(emails);
      }).catch(err => console.log(err))

    };

    sendMyNewEmails = (tab) => {
      console.log(tab) // here I get 3 correct objects with correct subject and body
      tab.forEach(function(entry) {
        Email.sendMail(entry);
    });
    }

    sendMail = async (payload) => {

      var mailOptions = {
        from: 'email@email.email',
        to: payload.to,
        subject: payload.subject,
        text: payload.text,
        html: payload.html   
      };

      transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          console.log(error)
        }
      });

})(i);

    }

推荐阅读