SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【FakeSMTP】メールテスト用ツールFakeSMTPをLinuxマシン上で稼働させる

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  59  2015 fakeSMTP-2.0.jar
-rw-r--r--. 1 wantan group1 1678306  525 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マシンからの参照もスムーズになるかと思います。