10

Expressjs アプリでnodemailerを使用しようとしています。ルート ハンドラーの外でトランスポート オブジェクトを作成し続ける必要がありますか?それともルート ハンドラー内でトランスポート オブジェクトを作成しても問題ありませんか?

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

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

また

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

  app.post('/register', function(req, res){
    smtpTrans = nodemailer.createTransport('SMTP', {
      service: 'Gmail',
      auth: {
          user: "me@gmail.com",
          pass: "application-specific-password" 
      }
    });
    smtpTrans.sendMail(mailOptions);
  });
4

1 に答える 1

8

選択するには、ユースケースについて考える必要があります。

の SMTP トランスポートはnodemailer、明示的に閉じる必要がある接続プールを作成します。接続は常に開いたままなので、これは良いことです。接続の遅延 (TLS ネゴシエーションなどを含む) は、アプリの起動時にのみ発生します。

最初の解決策は、大量のメッセージを送信する場合に適しています。接続を開いたままにしておくことで、接続プールを使用して遅延とリソースの使用を最小限に抑えることができます。

一方、2 番目の解決策は、送信するメッセージが少ない場合に適しています。1 時間に 1 通の電子メールを送信する場合は、接続を維持する必要はありません。現在のコードは少し間違っているので注意してください: 接続プールを明示的に閉じる必要があります。そうしないと、オブジェクトへの参照を失ったとしても、接続プールは開いたままになります。

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

この問題を見ると、すべてのエラーがコールバックのerrパラメーターで報告されているようです。smtpTrans.sendMail

編集:この回答はNodemailer 0.7用に書かれました。1.0 がリリースされ、トランスポートと接続の処理方法など、いくつかの重大な変更が加えられました。詳細については、このブログ投稿を参照してください。

于 2014-01-14T13:30:12.177 に答える