用Nodemailer发送多封邮件的问题--主题不改变。

问题描述 投票:0回答:1

我试图用nodejs和nodemailer发送多封邮件,我尝试了+50种方法,直到现在,结果总是一样的:传送者发送的邮件主体不同,但主题相同。

我试着用逻辑函数逐一发送,我改成把所有邮件的有效载荷推送到一个数组中,然后调用一个函数来发送,但总是一样的:同样的主题(当我做console.log时,我看到3个不同的和正确的邮件对象)。

这是我的代码(Books是一个mongoose模型)。

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:["[email protected]"],
          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 protected]',
    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);
        }
     });
  });

}

UPDATE :

当我在收到的邮件中点击邮件详情时,我看到了正确的主题,但在收件箱中却出现了错误的旧主题(甚至在代码中不存在)。

这里的主题是错误的(所有3封邮件都是这个主题) Here 3 emails with old / wrong subject

这里的邮件里面的主题是正确的。Subject correct

node.js express email asynchronous nodemailer
1个回答
0
投票

使用关闭函数调用(s)。

    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:["[email protected]"],
              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 protected]',
        to: payload.to,
        subject: payload.subject,
        text: payload.text,
        html: payload.html   
      };

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

})(i);

    }

0
投票
const TypesBook = [
    "Comic",
    "Action",
    "Adventure"
];

const sendDailyEmails = async(stringday) => {
    try{
        const emails = []; 
        const books = await Books.find({day: stringday})
        for (let type of TypesBook) {
            const emailPayload = {
                from: ``,
                to: [`[email protected]`] ,
                subject : `[Book ${type}] is availbale at day ${stringday}`
            }
            for (let book of books) {
                if (type = book.Type) {
                    const newPayload = Object.assign({}, emailPayload);  // add this ine
                    newPayload[`html`] =                                //change this line
                    `Hi 
                    Your book ${type} is ready <br/><br />
                    details: ${book.Length.pages} <br/>`
                    emails.push(newPayload )                             //change this line
                }
            }
        }
        sendMyNewEmails(emails);
    }catch(err){
        throw err;
    }
};

const sendMyNewEmails = tab => {
    try{
        tab.map(entry => {
            Email.sendMail(entry);
        });
    }catch(err){
        throw err;
    }
}

const sendMail = async payload => {
    try{
        const mailOptions = {
            from: '[email protected]',
            to: payload.to,
            subject: payload.subject,
            text: payload.text,
            html: payload.html   
        };

        const info = await transporter.sendMail(mailOptions)
    }catch(err){
        throw err;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.