Отправка электронной почты нескольким получателям через 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
});
вы отправляете электронные письма асинхронно, поэтому вам нужна функция ожидания, которая ждет всех писем, пока они не будут отправлены, потому что если нет, вы выходите из программы, и некоторые из запросов не выполняются. Таким образом, вы должны сделать своего рода функцию тайм-аута, которая проверяет, были ли отправлены электронные письма.