ローカル完結で、簡単な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・本文を持ったオブジェクトがコンソールに表示されます。
(どこにも送信はされません。受け取った引数を用いれば、メール転送も実装可能です。)
これで、簡単にメールが確認できました。