FakeSMTP
FakeSMTPはアプリケーションのメールテストなどで使用できる簡易メールサーバツールです。
開発を行っているWindowsマシン上であれば、ポートやメールボックスとなるフォルダを指定するだけでかなり簡単に使用することができると思います。
今回はこれをLinuxマシン上で稼働させます。
・公式リンク
FakeSMTP – FakeSMTP - Dummy SMTP server for developers
・ダウンロードリンク
FakeSMTP – FakeSMTP - Download
上記からfakeSMTP-latest.zipをダウンロードしました。
FakeSMTPをLinux上で稼働させる
準備
まず稼働のためにはLinux上にjava
がインストールされている必要があります。
多分バージョンはそこまで制限がないと思います。
[root@server1 ~]# java -version openjdk version "1.8.0_292" OpenJDK Runtime Environment (build 1.8.0_292-b10) OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
インストールされていない場合はインストールを行う。
サーバの任意の場所に配置します。
配置したら解凍を行います。
[wantan@server1 mail_test]$ unzip fakeSMTP-latest.zip
fakeSMTP-2.0.jar
など任意のバージョンのツールが解凍できていれば問題ありません。
[wantan@server1 mail_test]$ ll fakeSMTP-* -rw-r--r--. 1 wantan group1 1848214 5月 9 2015 fakeSMTP-2.0.jar -rw-r--r--. 1 wantan group1 1678306 5月 25 23:06 fakeSMTP-latest.zip
FakeSMTPの起動
Linuxマシン上のコマンドラインでは、以下のようなコマンドで起動を行います。
[wantan@server1 mail_test]$ java -jar fakeSMTP-2.0.jar -s -b -p 2525 -a localhost -o /home/share/mailbox 30 5 2021 18:40:25 INFO org.subethamail.smtp.server.SMTPServer - SMTP server localhost/127.0.0.1:2525 starting 30 5 2021 18:40:25 INFO org.subethamail.smtp.server.ServerThread - SMTP server localhost/127.0.0.1:2525 started
■オプション
オプション | 内容 |
---|---|
-s | 自動起動モード |
-b | バックグラウンド起動(CLI起動) |
-p | ポート指定 |
-a | ホスト、アドレス指定 |
-o | アウトプットディレクトリ指定(メールの格納先) |
その他のオプションや詳細についてはヘルプで確認することもできます。
[wantan@server1 mail_test]$ java -jar fakeSMTP-2.0.jar --help usage: java -jar fakeSMTP-2.0.jar [OPTION]... -a,--bind-address <arg> IP address or hostname to bind to. Binds to all local IP addresses if not specified. Only works together with the -b (--background) argument. -b,--background If specified, does not start the GUI. Must be used with the -s (--start-server) argument -e,--eml-viewer <arg> Executable of program used for viewing emails -m,--memory-mode Disable the persistence in order to avoid the overhead that it adds -o,--output-dir <arg> Emails output directory -p,--port <arg> SMTP port number -r,--relay-domains <arg> Comma separated email domain(s) for which relay is accepted. If not specified, relays to any domain. If specified, relays only emails matching these domain(s), dropping (not saving) others -s,--start-server Automatically starts the SMTP server at launch
また、普通に起動するとコマンドを終了するとツールもダウンするので、実践的に使用する場合はバックグラウンドやnohup
で起動することもあるかもしれません。
[wantan@server1 mail_test]$ nohup java -jar fakeSMTP-2.0.jar -s -b -p 2525 -a localhost -o /home/share/mailbox &
起動確認
メール送信用のアプリケーションが用意できているわけではないので、Linux上のメールコマンドで確認を行います。
例えば以下のようなコマンドで、自分自身の2525ポートにメールを送信します。
echo "メールのテスト。" | mail -s "test title" -S "smtp=smtp://127.0.0.1:2525" hoge@example.com
コマンドを発行した後、アウトプットディレクトリを確認して、以下のようなメールファイルが確認できれば問題ないはずです。
[wantan@server1 mailbox]$ cd /home/share/mailbox/ [wantan@server1 mailbox]$ cat 300521064707962.eml Sun, 30 May 2021 18:47:07 +0900 (JST) Date: Sun, 30 May 2021 18:47:07 +0900 From: wantan@server1.test To: hoge@example.com Subject: test title Message-ID: <60b35f1b.djJ+4Dy55yHmWR0k%wantan@server1.test> User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit メールのテスト。 [wantan@server1 mailbox]$
問題なく稼働していそうです。
実践的な構成を考えてみる
ただ単に起動するだけでは味気ないので実際に使用する場合の起動スクリプトなどを考えてみます。
想定要件
要件として以下のような想定を行って、起動スクリプトを作成してみます。
・FakeSMTPはバックグラウンドで起動する。
・起動時に確認メールを送信する。
・停止もできるようにする。
・日付ごとにメールボックスディレクトリを作成する。
・日付が変わるとき(または任意のタイミング)に再起動して、メールの格納先を変更する。
・60日を経過したメールボックスディレクトリは削除する。
スクリプトの作成
上記の要件から以下のスクリプトを作成しました。
もちろんパスの指定やコメント細かい部分は変更してもなんの問題もありません。
#!/bin/bash mailhome=/mnt/maildir today=$(date +%Y%m%d) mboxdir="$mailhome/$today" appPath=/usr/local/wantan/etc/fakeSMTP-2.0.jar pid=$(pgrep -f fakeSMTP-2.0.jar) if [ -n "$pid" ]; then pkill -f fakeSMTP-2.0.jar # 停止するまで待つ※処理の簡易化 sleep 2 echo "停止メッセージ" fi if [[ 'stop' = $1 ]]; then exit fi # メールボックスディレクトリの作成 if [ ! -d "$mboxdir" ]; then mkdir "$mboxdir" chmod 777 "$mboxdir" echo "ディレクトリ作成メッセージ" fi # fakeSMTPの起動 nohup java -jar "$appPath" -s -b -p 2525 -a localhost -o "$mboxdir" > /dev/null 2>&1 & echo "起動メッセージ" # 起動するまで2秒間待つ※処理の簡易化 sleep 3 # テストメール送信 echo "このメールがメールボックスに受信されていれば正しく起動できています。" | mail -s "test title" -S "smtp=smtp://127.0.0.1:2525" to@example.com echo "テストメール送信メッセージ" # 60日以上経過したディレクトリは削除する rmday=$(date --date '60 days ago' +%Y%m%d) olddir="$mailhome/$rmday" if [ -d "$olddir" ]; then rm -rf "$olddir" fi
「# 停止するまで待つ※処理の簡易化」の部分については停止コマンド実行後、完全に停止する前に次の起動コマンドが実行されるとエラーになり、起動に失敗するから。
「# 起動するまで2秒間待つ※処理の簡易化」の部分も同様に起動しきる前にメール送信テストを行うとエラーになるため。こちらはメールのテスト送信を行わない場合には不要になります。
「※処理の簡易化」というのは、プロセスなどで起動や停止を確認した方が確実そうですが、とりあえずパッと作りたかったので、低スペックマシンでもほぼ次のコマンドが失敗しない時間だけ停止させることにしました。
起動停止
上記のスクリプトを起動停止すると以下のような感じになります。
・起動
上記のスクリプトでは引数なし(stop以外)で実行すると、ツールが起動します。
既にツールが起動している場合には停止後に起動を行います。
[root@server1 bin]# ./fakesmtpctl.sh 停止メッセージ 起動メッセージ テストメール送信メッセージ
・停止
上記の仕様だと普通に実行すると必ず起動してしまうので、引数に「stop」を渡した場合には、起動している場合は停止を行うようになっています。
[root@server1 bin]# ./fakesmtpctl.sh stop 停止メッセージ [root@server1 bin]#
cronで定期実行
上記のスクリプトを毎日実行すればその日ごとのディレクトリが作成され、そこにメールが格納されるようになりますが、使用する頻度がそれなりにある場合などにはcron
に仕込んで定期実行されるようにします。
これによって、勝手に日付ごとのディレクトリが作成され、その日付のディレクトリに格納されるようになります。
例えば以下では毎日0時5分にスクリプト実行することで、ツールを起動し直してディレクトリを再作成してメールボックスのディレクトリを指定し直します。
[root@server1 bin]# crontab -e 5 0 * * * source /usr/local/wantan/bin/fakesmtpctl.sh
あとは例えばファイルサーバとして構築するか、ファイルサーバをマウントするなどすればWindowsマシンからの参照もスムーズになるかと思います。