【问题标题】:node.js: looping, email each matching row from query but it it emails the same user by # number of matches?node.js:循环,从查询中通过电子邮件发送每个匹配的行,但它通过#匹配数向同一用户发送电子邮件?
【发布时间】:2014-10-14 06:33:02
【问题描述】:

我有一个运行良好的 node.js 电子邮件服务器,但是我发现了一个问题。如果查询字符串找到 4 行,它将发送四封电子邮件,但只发送到第一个结果而不是每个找到的电子邮件地址。

var mysql = require('mysql');
var nodemailer = require('nodemailer');

// Amazon SES is sending the emails - uses this module for node
var ses = require('nodemailer-ses-transport');
//transport for connecting with Amazon SES
var transporter = nodemailer.createTransport(ses({
accessKeyId: '****************',
SecretAccessKey: '*************'
}));

// Mysql Connection to database
var connection = mysql.createConnection({
*****connection info goes here *****
});
//Connect to mysql database and check for errors
connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;}
  });

var querystring1 = 'SELECT `date_created`,`first_name`,`last_name`,`email` FROM `users` WHERE TIMESTAMPDIFF(SECOND,date_created, NOW()) <=298 AND `email`!="" LIMIT 0,5';

connection.query(querystring1, function (err, row) {
if (err) throw err;
for (var i in row) {
// Email content; change text to html to have html emails. row[i].column name will pull relevant database info
var sendit = {
    to: row[i].email,
    from: '******@******',
    subject: 'Hi ' + row[i].first_name + ', Thanks for joining ******!',
    html:  {path:__dirname + '/templates/welcome.html'}
};

// Send emails
transporter.sendMail(sendit,function(error,response){
    if (error) {
        console.log(error);

    }else{
    console.log("Message sent1: " + row[i].first_name);}
transporter.close();}
)
}});

....

如何让它遍历找到的每个行并使用行数据单个行数据发送自定义电子邮件?

【问题讨论】:

  • 您的日志消息可能总是会打印最后一条,因为在循环结束后调用 sendMail 回调并且 var i 定义在上层函数范围并保存最后一次迭代索引(javascript 没有块范围)。但是,仍然有可能将邮件发送给 4 个不同的个人
  • 我是这么认为的,但是我遇到了一个奇怪的问题,即一些触发的电子邮件在发送给我进行测试时会以双倍的形式出现。我认为这是一个机器人(不),时区重叠(不),现在它是有道理的......它正在发送重复邮件,因为查询检测到两行,但跳过了第二个用户的行信息......它只是重复第一个。

标签: javascript mysql node.js email row


【解决方案1】:

请使用这个,我已经测试过了,效果很好:

function sendmail(sendit, username){
  transporter.sendMail(sendit,function(error,response){
    if (error) {
      console.log(error);
    } else {
      console.log("Message sent: " + username);}
      transporter.close();
    }
  )
};


for (var i in row) {
  var sendit = {
    to: row[i].email,
    from: 'sandeepv@gmail.com',
    subject: 'Hi ' + row[i].first_name + ', Thanks for joining!',
    html:  {path:__dirname + '/welcome.html'},
  };

  // Send email
  sendmail(sendit, row[i].first_name);
}

【讨论】:

    【解决方案2】:

    在您发送完所有电子邮件之前,请勿关闭传输器。

    var querystring1 = 'SELECT `date_created`,`first_name`,`last_name`,`email` FROM `users` WHERE TIMESTAMPDIFF(SECOND,date_created, NOW()) <=298 AND `email`!="" LIMIT 0,5';
    
    connection.query(querystring1, function (err, row) { if (err) throw err; 
    var toSend=[];
    for (var i in row) { // Email content; change text to html to have html emails. 
    toSend.push({//row[i].column name will pull relevant database info 
        to: row[i].email,
        from: '******@******',
        subject: 'Hi ' + row[i].first_name + ', Thanks for joining ******!',
        html:  {path:__dirname + '/templates/welcome.html'} 
     });
    }
    
    // Send emails
     async.eachSeries(toSend, function( sendit, callback) {
        transporter.sendMail(sendit,function(error,response){
    
            if (error) {
            callback(error);
    
             }else{
            console.log("Message sent1: " + sendit.to); callback();
             }
         )},function(err){if (err) throw (err); console.log("Finished")};
     });
    });
    

    【讨论】:

    • 没用,仍然选择第一个结果并为每场比赛爆破他们
    • @udonsoup16 让我考虑一下,然后再回复你。一些小事,但在这里删除最后一个',': html: {path:__dirname + '/templates/welcome.html'}, };
    • @udonsoup16 在不关闭传输器的情况下试一试。这将帮助您了解这是您关闭得太早的运输工具还是其他原因。
    • 不是最漂亮的解决方案,但您可以尝试使用 async.js 并使用 forEach 元素。我会在几分钟后用它来编辑我的答案。
    • 谢谢,我今晚晚些时候试试!
    【解决方案3】:

    试试这个

    // Send emails
    (function (mail) {
        transporter.sendMail(mail,function(error,response){
            if (error) {
                console.log(error);
            }else{
                console.log("Message sent1: " + mail.first_name);}
                transporter.close();
            }
        )
    )(sendit);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2022-01-13
      • 2022-08-14
      • 2012-01-13
      • 2013-02-21
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多