Отправка электронной почты нескольким получателям через nodemailer

Я пытаюсь отправить электронное письмо нескольким получателям. Для этого я создал массив получателей, но с моим кодом я могу отправлять почту только на последний идентификатор электронной почты массива три раза. Что не так с моим кодом?

var nodemailer = require("nodemailer");

var smtpTransport = nodemailer.createTransport(
"SMTP",{
  host: '',
  //  secureConnection: true,         // use SSL
  port: 25
});

var maillist = [
  '****.sharma3@****.com',
  '****.bussa@****.com',
  '****.gawri@****.com',
];

var msg = {
    from: "******", // sender address
    subject: "Hello ✔", // Subject line
    text: "Hello This is an auto generated Email for testing  from node please ignore it  ✔", // plaintext body
    cc: "*******"    
    //  html: "<b>Hello world ✔</b>" // html body
}


maillist.forEach(function (to, i , array) {
  msg.to = to;

  smtpTransport.sendMail(msg, function (err) {
    if (err) { 
      console.log('Sending to ' + to + ' failed: ' + err);
      return;
    } else { 
      console.log('Sent to ' + to);
    }

    if (i === maillist.length - 1) { msg.transport.close(); }
  });
});

6 ответов


ваша проблема ссылается на тот же объект msg из асинхронного кода. Foreach завершается до того, как sendMail отправит электронные письма.

so msg.быть последним элементом из объекта maiilist.

попробуйте клонировать / копировать msg внутри maillist foreach или просто переместите определение msg туда:

maillist.forEach(function (to, i , array) {


  var msg = {
        from: "******", // sender address
        subject: "Hello ✔", // Subject line
        text: "Hello This is an auto generated Email for testing  from node please ignore it  ✔", // plaintext body
        cc: "*******"    
        //  html: "<b>Hello world ✔</b>" // html body
    }
  msg.to = to;

  smtpTransport.sendMail(msg, function (err) {

nodemailer (v2.4.2)docs говорят:

to-список, разделенный запятыми, или массив адресов электронной почты получателей, которые будут отображаться в поле Кому:

Так что вы можете просто сделать:

var maillist = [
  '****.sharma3@****.com',
  '****.bussa@****.com',
  '****.gawri@****.com',
];

var msg = {
    from: "******", // sender address
    subject: "Hello ✔", // Subject line
    text: "Hello This is an auto generated Email for testing  from node please ignore it  ✔", // plaintext body
    cc: "*******",
    to: maillist
}

насколько я знаю, вы сможете получить несколько получателей, как это

"mail1@mail.com,mail2@mail.com,mail3@mail.com,mail4@mail.com"

Так почему бы вам не сделать что-то вроде

var maillist = '****.sharma3@****.com, ****.bussa@****.com, ****.gawri@****.com';

var msg = {
    from: "******", // sender address
    to: maillist,
    subject: "Hello ✔", // Subject line
    text: "Hello This is an auto generated Email for ...  ✔", // plaintext body
    cc: "*******"    
    //  html: "<b>Hello world ✔</b>" // html body
}

Я уже пробовал и это работает. Кроме того, с моей точки зрения, почему вы должны беспокоиться о "асинхронно" или отправке писем 1K раз, если у вас есть возможность отправки все они только один раз без каких-либо осложнений?

в любом случае надеюсь, что эта помощь, ответьте на свой вопрос или это может помочь кому-то иначе!--3-->

конечно, мой ответ может быть улучшена..


var maillist = [
  '****.sharma3@****.com',
  '****.bussa@****.com',
  '****.gawri@****.com',
];

maillist.toString();

var msg = {
    from: "******", // sender address
    to: maillist,
    subject: "Hello ✔", // Subject line
    text: "Hello This is an auto generated Email for testing  from node please ignore it  ✔", // plaintext body
    cc: "*******"    
    //  html: "<b>Hello world ✔</b>" // html body
}

хорошим способом сделать это асинхронно было бы использовать каждую функцию в асинхронном модуле:https://caolan.github.io/async/docs.html#each

var async = require("async");

async.each(maillist, function(to, callback){

    msg.to = to;

    smtpTransport.sendMail(msg, function (err) {
        if (err) { 
            console.log('Sending to ' + to + ' failed: ' + err);
            callback(err);
        } else { 
            console.log('Sent to ' + to);
            callback();
        }
    });
}, function(err){
    if(err){
        console.log("Sending to all emails failed:" + err);
    }

    //Do other stuff or return appropriate value here
});

вы отправляете электронные письма асинхронно, поэтому вам нужна функция ожидания, которая ждет всех писем, пока они не будут отправлены, потому что если нет, вы выходите из программы, и некоторые из запросов не выполняются. Таким образом, вы должны сделать своего рода функцию тайм-аута, которая проверяет, были ли отправлены электронные письма.