如何在节点js的循环中异步发送批量邮件?

时间:2017-05-18 12:52:43

标签: javascript node.js email asynchronous nodemailer

我想以异步方式向用户发送多封邮件。

  • user.js文件

    var emailUtil = require(" ./ emailUtil.js");     var userdata [100];

    //假设在userdata中有多个数据,让它为100

    for(let i = 0; i      让emailBody ='邮件正文',emailSubject =' SGT Schedule&#39 ;;      emailUtil.sendEmail(emailBody,'',emailSubject,'''''              #39;&#39); }

在我编写电子邮件发送功能的另一个文件中

  • emailUtil.js

    //电子邮件工具文件

    var nodemailer = require('nodemailer');
    
    // Not the movie transporter!
      var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
              user: 'email id', // Your email id
              pass: '*******' // Your password
          }
      });
    
    
    
    
        module.exports =
    
    {
    
       sendEmail: function sendMail(varhtml,vartext, 
            varsubject,varfrom, varfrom_name,varto, varto_name, 
          reply_to_email ) {
    
    
       //setup e-mail data with unicode symbols
       var mailOptions = {
    
           to: [varto], // list of receivers
           subject: varsubject, // Subject line
           text: vartext, // plaintext body
           html: varhtml // html body
       };
    
    
       console.log(mailOptions);
    
       // send mail with defined transport object
        transporter.sendMail(mailOptions, function (error, info) {
           if (error) {
               return console.log(error);
           }else{
             return console.log(info);
           }
       });
    

    } }

我想立即发送回复。我不需要等待电子邮件 所以为了做到这一点,我正在考虑使用循环发送邮件,但是异步。

Currenlty,我在发送邮件之前发送我的回复然后只是调用邮件功能?如果有人向该api发送另一个请求,那么将花费更多的时间,因为node.js是一个单线程,并且这个线程正在等待执行其代码(之前的api调用总线发送邮件)或者它不会查看只创建该文件的另一个实例

希望我能够正确解释我的问题。如果有任何疑虑,请告诉我

1 个答案:

答案 0 :(得分:0)

for position, image in enumerate(watch_image_urls):
    if image.startswith('/'):
        watch_image_urls[position] = 'https://denissov.ru' + image

print watch_image_urls

这个函数可以这样调用,以达到理想的效果:

sendEmail: (somevariables balbla) {
  //some code
  transporter.sendEmail((err, res) => {
    console.log(err);
    console.log(res);
  });
}

它将被称为一百次,而不是关心或等待回应。 现在,如果您的电子邮件功能是这样的:

for(let i = 0; i < 100; i++) {
  sendEmail(someParams);
}

您仍然可以使用循环调用它并忽略回调返回的任何内容。如果您的功能如下:

sendEmail: (somevariables balbla, callback) {
  //some code
  transporter.sendEmail((err, res) => {
    console.log(err);
    console.log(res);
    return callback(err, res);
  });
}

tl; dr 在循环中调用您的函数,它会执行您想要的操作。如果你想要,你可以让你的函数返回一个promise或一个回调,以防在其他情况下你想等待它的结果。