2014-01-14 7 views
7

Ich versuche nodemailer in Expressjs App zu verwenden. Soll ich ein Transportobjekt aus dem Routen-Handler erstellen oder ein Transportobjekt innerhalb des Routen-Handlers erstellen, ist das in Ordnung?Was ist die richtige Art der Verwendung von Nodemailer in Expressjs?

var express = require('express') 
    , app = express() 
    , nodemailer = require('nodemailer'); 

    smtpTrans = nodemailer.createTransport('SMTP', { 
     service: 'Gmail', 
     auth: { 
      user: "[email protected]", 
      pass: "application-specific-password" 
     } 
    }); 
    app.post('/register', function(req, res){ 
    smtpTrans.sendMail(mailOptions); 
    }); 

oder

var express = require('express') 
    , app = express() 
    , nodemailer = require('nodemailer'); 

    app.post('/register', function(req, res){ 
    smtpTrans = nodemailer.createTransport('SMTP', { 
     service: 'Gmail', 
     auth: { 
      user: "[email protected]", 
      pass: "application-specific-password" 
     } 
    }); 
    smtpTrans.sendMail(mailOptions); 
    }); 
+0

Die Dokumentation besagt, dass * "Das gleiche Transportobjekt kann und sollte mehrmals wiederverwendet werden." * (Siehe [hier] (https://github.com/andris9/Nodemailer#setting-up-a-transport-method)), also denke ich, der richtige Weg ist dein erstes Beispiel. –

+0

Das wird die SMTP-Verbindung auf immer richtig halten? – Yalamber

+0

In der Tat. Was Sie wünschen, wenn Sie viele Nachrichten senden, um den Overhead der Verbindungszeit zu reduzieren. –

Antwort

6

Sie haben über Ihre Benutzung Fall zu denken, eine Wahl zu treffen.

Der SMTP-Transport in erstellt einen Verbindungspool, den Sie explizit schließen müssen. Das ist gut, weil die Verbindung immer offen bleibt: Sie erleiden nur die Verbindungsverzögerungen (einschließlich TLS-Aushandlung usw.) beim Start der App.

Ihre erste Lösung ist dann gut, wenn Sie viele Nachrichten senden: Indem Sie eine Verbindung offen halten, minimieren Sie die Verzögerung und Ressourcenauslastung, indem Sie den Verbindungspool verwenden.

Auf der anderen Seite ist Ihre zweite Lösung gut, wenn Sie wenige Nachrichten senden: Es besteht keine Notwendigkeit, eine Verbindung aufrechtzuerhalten, wenn Sie eine E-Mail pro Stunde senden. Seien Sie vorsichtig, da Ihr aktueller Code ein bisschen falsch ist: Sie müssen den Verbindungspool explizit schließen. Ist dies nicht der Fall, bleibt der Verbindungspool geöffnet, auch wenn Sie den Verweis auf das Objekt verlieren.

smtpTrans = nodemailer.createTransport('SMTP', { … }); 
smtpTrans.sendMail(mailOptions, function (err, responseStatus) { 
    smtpTrans.close(); // Don't forget to close the connection pool! 
}); 

Von den Blicken von this issue, so scheint es, dass alle Fehler in den err Parametern des smtpTrans.sendMail Rückrufs gemeldet werden.

Bearbeiten: Diese Antwort wurde für Nodemailer 0.7 geschrieben. 1.0 ist jetzt out und hat einige einschneidende Änderungen, einschließlich der Handhabung von Transporten und Verbindungen. Weitere Informationen finden Sie unter blog post.

+0

Wird es smtpTransport.close(); oder smtpTrans.close();? – Yalamber

+0

Das war ein Tippfehler, behoben den Code. –

+2

Der Verbindungspool von Nodemailers ist "faul", Verbindungen werden nur aufrechterhalten, wenn einige E-Mails gesendet werden. Dies bedeutet auch, dass wenn Sie den Transport nicht explizit schließen, geöffnete SMTP-Verbindungen bleiben, bis der Server diese für Inaktivität schließt - schließlich den gleichen geschlossenen Zustand, den Sie mit transport.close() gehabt hätten. Höchstwahrscheinlich möchten Sie jedoch keine ungenutzten Verbindungen. – Andris

Verwandte Themen