LoginSignup
8
4

More than 5 years have passed since last update.

Node.jsでテスト用の軽量SMTPサーバーを動作させる。

Last updated at Posted at 2018-07-10

ローカル完結で、簡単なSMTPサーバーをテストに利用したい

簡易的なSMTPサーバーは色々ありますが、設定がよくわからなかったり、インストールが面倒だったりで、なかなかうまくいきませんでした。(完全に私の知識不足)

そこで、下記のライブラリを用いて、node.jsのみで動く簡単なSMTPサーバーを構築しました。

  • smtp-server(SMTPサーバー用)
  • mailparser(リクエスト内容の解析)
  • jconv(文字コードの変換。nodeで書かれているので、Windows SDKとかの考慮は不要です。)

実装

まずは、各ライブラリをインストールします。

npm install --save smtp-server
npm install --save mailparser
npm install --save jconv

下記を保存して、nodeコマンドで実行すれば、587ポートでSMTPサーバーが立ち上がります。
今回は、TLS不使用のユーザー名・パスワードによる認証だったので、下記の構成になっています。

下記のサイトを見ると、いろんなオプションが指定できるので、試してみてください!
https://nodemailer.com/extras/smtp-server/

const {
  SMTPServer
} = require('smtp-server');

const {
  simpleParser
} = require('mailparser');

const jconv = require('jconv');

const server = new SMTPServer({
    // STARTTLSコマンドを無効化
    disabledCommands: ['STARTTLS'],

    // ユーザーID・パスワード確認
    onAuth(auth, session, callback) {
      if (auth.username !== 'aaa' || auth.password !== 'bbb') {
        return callback(new Error('Invalid username or password'));
      }

      callback(null, {
        user: 'aaa'
      });
    },

    // 送信者 確認
    onMailFrom(address, session, callback) {
      if (address.address !== 'test@example.com') {
        return callback(new Error('test@example.com 以外からの送信は受け付けません!'));
      }
      return callback();
    },

    // 内容 確認
    onData(source, session, callback) {
      source.pipe(process.stdout);
      simpleParser(source)
        .then(({
          from,to,bcc,cc,subject,text
        }) => {
          console.log({
            from: from.text,
            to: to.text,
            cc: (cc || {text: ''}).text,
            bcc: (bcc || {text: ''}).text,
            subject,
            // 今回本文は、ISO-2022-JPでしたので、JISです!
            text: jconv.decode(text, "JIS"),
          });
        })
        .catch(err => {
          console.log(err);
        })

      source.on('end', callback);
    }
  })
  .listen(587)
  .on('error', err => {
    console.log(err.name, err.message, err.stack);
  });

SMTPリクエストと、FROM・TO・CC・BCC・本文を持ったオブジェクトがコンソールに表示されます。
(どこにも送信はされません。受け取った引数を用いれば、メール転送も実装可能です。)
これで、簡単にメールが確認できました。

8
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4