2015-02-15 11 views
9

Sto tentando di inviare e-mail a più destinatari. Per questo ho creato una serie di destinatari, ma con il mio codice sono solo in grado di inviare la posta all'ultimo ID e-mail dell'array tre volte. Cosa c'è che non va nel mio codice?Invio di e-mail a più destinatari tramite 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(); } 
    }); 
}); 

risposta

5

Il tuo problema fa riferimento allo stesso oggetto msg dal codice asincrono. Il foreach viene completato prima che sendMail invii le e-mail.

Quindi msg.for sarà l'ultimo elemento dall'oggetto maiilist.

Prova di clonare/copia msg all'interno maillist foreach, o semplicemente spostare definizione msg a lì:

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

Grazie per l'aiuto ora il suo lavoro bene –

0

si stanno inviando le email in modo asincrono quindi è necessario una funzione di attesa che attende tutte le mail fino a quando non sono stati inviati perché se non, si programmano le uscite e alcune delle richieste non verranno soddisfatte. Quindi devi fare una sorta di funzione di timeout che controlla se le e-mail sono state inviate.

14

Per quanto ne so si sarà in grado di ottenere più destinatari come questo

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

Allora perché non fare qualcosa di simile

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 
} 

ho già provato e sta funzionando. Inoltre, dal mio punto di vista, perché ti devi preoccupare di "in modo asincrono" o di inviare e-mail 1K volte se hai la capacità di inviare tutti gli in una volta sola senza alcuna complicazione?

speranza Comunque questo aiuto, rispondere alla tua domanda o può aiutare qualcun altro

Sicuramente, la mia risposta può essere migliorato ..

+0

sì, anche questo è possibile ma, non so in anticipo l'elenco TO del destinatario, ci può essere un numero qualsiasi di destinatari. –

+0

Ma stai ricevendo questi destinatari da qualche altra parte ... Voglio dire che stai cercando una forma o una variabile, penso ... A proposito, penso che potresti aggiungere una sorta di pre-processo all'e-mailist prima che tu sia invio di e-mail in modo da ottenere tutto in una volta ... Sto mettendo un plunkr con l'idea e il formato di come ottenere la variabile maillist completamente formato e solo per mettere su "msg" prima di inviare l'email http://plnkr.co/edit/giNSNHJTlrEi5nj8WmG5 – ackuser

+0

e come passare la variabile da js a file 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

Si prega di elaborare la soluzione, quindi è più chiara. – Scorpio

10

nodemailer (v2.4.2) docs dicono:

to - Elenco separato da virgola o matrice di indirizzi di posta elettronica dei destinatari che verranno visualizzati nel campo A:

quindi si può solo fare:

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

Un buon modo per farlo in modo asincrono sarebbe quello di utilizzare il ciascuna funzione nel modulo asincrona: 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 
}); 
Problemi correlati