2015-02-15 3 views
9

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

var nodemailer = require("nodemailer"); 

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

var maillist = [ 
    '****[email protected]****.com', 
    '****[email protected]****.com', 
    '****[email protected]****.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(); } 
    }); 
}); 

ответ

5

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

Таким образом, msg.to будет последним элементом объекта майилист.

Попытка клонировать/копировать Сообщ внутри Maillist Еогеасп, или просто переместить определение Сообщ туда:

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) { 
+0

Спасибо за помощь в настоящее время его рабочего штраф –

0

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

14

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

"[email protected],[email protected],[email protected],[email protected]" 

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

var maillist = '****[email protected]****.com, ****[email protected]****.com, ****[email protected]****.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 
} 

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

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

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

+0

да это также будет возможно, но я заранее не знаю список получателей TO, может быть любое количество получателей. –

+0

Но вы получаете этих получателей откуда-то еще ... Я имею в виду, что вы получаете форму или переменную, я думаю ... Кстати, я думаю, что вы могли бы добавить какой-то предварительный процесс в адрес электронной почты, прежде чем вы отправляя любые электронные письма, чтобы вы получили все их в один раз ... Я помещаю plunkr с идеей и форматом того, как получить переменную maillist полностью форматировать и просто надеть «msg» перед отправкой по электронной почте http://plnkr.co/edit/giNSNHJTlrEi5nj8WmG5 – ackuser

+0

и как передать переменную из js в файл Html? –

4
var maillist = [ 
    '****[email protected]****.com', 
    '****[email protected]****.com', 
    '****[email protected]****.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 
} 
+0

Пожалуйста, подробно остановитесь на своем решении, так что это яснее. – Scorpio

10

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

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

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

var maillist = [ 
    '****[email protected]****.com', 
    '****[email protected]****.com', 
    '****[email protected]****.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 
} 
2

Хороший способ сделать это асинхронно будет использовать каждую функцию в модуле асинхронном: 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 
});