smtp4devでTLS通信のメールテスト実施方法

smtp4devとは

  • ダミーメールサーバー
  • 現在はv3系
  • 旧バージョン(v2)はGUI画面で設定変更も行えたが、v3はjsonを編集する必要有

github.com

インストール方法
  1. 上記サイトにアクセス
  2. 右側のReleasesカテゴリ内のLatestアイコンをクリック(2022/5/14時点3.1.4が最新)
  3. Assetsから利用するプラットフォームに沿ったモジュールをダウンロード
  4. 任意の箇所に配置

(補足)

  • ネットにはsmtp4dev v2系の情報が多いので、内容読み分ける必要有
  • 実行には.net Frameworkが必要
  • コンテナ版も用意されている

https://hub.docker.com/r/rnwood/smtp4dev/tags

実行方法・利用方法(Windowsの場合)
  • Rnwood.Smtp4dev.exe を実行
  • メールの確認はブラウザからアクセス(デフォルト:http://localhost:5000)
  • 利用したいプログラムから、smtp4devに対してメール送信すればOK(デフォルト:localhost:25)

本題:TLS通信を行う方法

smtp4devの設定方法
  • appsettings.json というファイルを編集する
  • TlsModeというプロパティをStartTls or ImplicitTlsに変更

  ・StartTlsなのかImplicitTlsなのかは、本番で利用するメールサーバーを想定して設定

  • HostNameをlocalhostではなく、ホスト名にしなければならない

 ・後述する自己証明書が生成される際にホスト名で生成されているため

  • Port番号は特段変更の必要はない

 ・どこかと被るのであれば変更する必要がある程度

  • smtp4devは自己証明書を保持しているので、それを利用する必要がある

 ・Javaの場合は、keytoolを使ってキーストアに自己証明書を登録する必要有
 ・Pythonの場合は、cerファイルをpemなどに変換する必要有

TLS確認方法
  • smtp4devでメール受信できた=TLS接続成功ではない(TLS接続せずに送信していたりする)
  • smtp4dev側には現時点ではデバック機能がなさそう

 ・Loggingの設定は用意されているが、どうも変更しても反応が無い
 ・その内設定していたら出力する実装をしてくれるかも

  • 現状メール送信側のデバック機能にて確認する必要がある

 ・Javaはjavax.net.debugを利用するのが良い
 ・Pythonはsmtplibのset_debuglevelを利用するのが良い

  • もしくは、WireSharkとかでProtocolがTLSv1.2とかなっているのを見るとか

 ・ローカルループバックは通常のインタフェースでは確認できない
 ・ローカルループバック用のインタフェースでパケットキャプチャしないといけない

参考リンク

smtp4devに関する設定の参考にしたサイト

開発用SMTPサーバーsmtp4devでTLS通信を行う #.NET - Qiita

Pythonでメール送信テストする際に参考にしたサイト

Pythonでメール送信 | Python学習講座

opensslコマンドでcerをpemに変換する際に参考にしたサイト

broadcom:PEM 形式へのファイルの変換

keytoolやjavax.net.debugの設定の参考にしたサイト

JSSEリファレンス・ガイド
SSL/TLS接続のデバッグ