javascript - 如何在 Node js 中循环异步发送批量邮件?

标签 javascript node.js email asynchronous nodemailer

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

  • user.js 文件
var emailUtil = require("./emailUtil.js");
var userdata[100];
        
// Suppose in userdata there are multiple data, let it be 100
    
for (let i = 0; i < userdata.length; i++) {    
    let emailBody = 'body of the mail', emailSubject = 'SGT Schedule';
    emailUtil.sendEmail(emailBody, '' , emailSubject, '' , '' , user_data.email, 'Your Name', '');
}

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

  • emailUtil.js
// Email Util File

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);
            }
        });
    }
}

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

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

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

最佳答案

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);
  });
}

您仍然可以使用循环调用它并忽略回调返回的任何内容。如果你的函数是这样的,也是一样的:

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

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

关于javascript - 如何在 Node js 中循环异步发送批量邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048327/

相关文章:

javascript - Datatables JS - 是否有一种 HTML 5 方法可以通过在 <th> 上指定数据顺序参数来对数据进行排序?

node.js - 当 Passportjs 上使用 Google Auth 时,自定义回调从未被调用

javascript - aws-serverless-express 具有 serverless-offline 阶段中断路由

javascript - node.js - MongoDB native 中的 RegExp

mysql - 构建一个发送电子邮件的交互式网站和数据库

java - 从 ImageHtmlEmail 获取电子邮件文本

javascript - 在Webview中从JS调用Titanium函数

javascript - 将字符串数组从 ajax 函数传递到 mvc Controller

laravel - Mailgun:从本地服务器上托管的本地 Laravel 项目发送电子邮件时出错(基于 LAN)

javascript - Firebase orderByChild 问题