メールサービスのサーバが古くなり、新しいサーバにそのシステムを引っ越しする必要があった。
ただ、新しいサーバでちゃんと動くのかどうか。動かなかった場合、大きなトラブルになる。
とはいえ「網羅する(だろう)テストケースを実施すればいいだろう」と思っていたが、システムトラブルは想定外で発生する。
そういう意味では、やりすぎなほどテストするべきとの思いもあり、なんとかテストする方法はないかと思ってたところ、MailCatcherなるものを見つけたので、やってみた。
ページコンテンツ
MailCatcherとは
どうやら以下のようなものらしい。
・Rubyのパッケージ。つまり、Rubyがインストールされてないとだめ。
・メール送信システム。いやゆるMTAの1つかな。でも送信しないで蓄積する。
・蓄積したメールを確認できるweb画面を提供している
今とりあえず思いつくのはこれぐらい。
まずはRubyをインストール
MailCatcherを導入するにあたりRubyが必要だが、これがなかったので、まずRubyのインストールから実施する。
それは、以下で実施した。
MailCatcherをインストールする
MailCatcherのサイトを見ると、以下のコマンドでインストールできるとのこと。
[root@localhost ~]# gem install mailcatcher
Fetching mail-2.7.1.gem
Fetching rack-protection-1.5.5.gem
Fetching sinatra-1.4.8.gem
Fetching mini_mime-1.1.2.gem
Fetching mailcatcher-0.8.1.gem
Fetching eventmachine-1.0.9.1.gem
Fetching tilt-2.0.10.gem
Fetching sqlite3-1.4.2.gem
Fetching rack-1.6.13.gem
Fetching thin-1.5.1.gem
Fetching daemons-1.4.1.gem
Fetching skinny-0.2.4.gem
Building native extensions. This could take a while...
Successfully installed eventmachine-1.0.9.1
Successfully installed mini_mime-1.1.2
Successfully installed mail-2.7.1
Successfully installed rack-1.6.13
Successfully installed rack-protection-1.5.5
Successfully installed tilt-2.0.10
Successfully installed sinatra-1.4.8
Building native extensions. This could take a while...
ERROR: Error installing mailcatcher:
ERROR: Failed to build gem native extension.
current directory: /root/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/sqlite3-1.4.2/ext/sqlite3
/root/.rbenv/versions/2.7.4/bin/ruby -I /root/.rbenv/versions/2.7.4/lib/ruby/2.7.0 -r ./siteconf20211111-9569-1g07xnk.rb extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/root/.rbenv/versions/2.7.4/bin/$(RUBY_BASE_NAME)
--with-sqlcipher
--without-sqlcipher
--with-sqlite3-config
--without-sqlite3-config
--with-pkg-config
--without-pkg-config
--with-sqlcipher
--without-sqlcipher
--with-sqlite3-dir
--without-sqlite3-dir
--with-sqlite3-include
--without-sqlite3-include=${sqlite3-dir}/include
--with-sqlite3-lib
--without-sqlite3-lib=${sqlite3-dir}/lib
To see why this extension failed to compile, please check the mkmf.log which can be found here:
/root/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0/sqlite3-1.4.2/mkmf.log
extconf failed, exit code 1
Gem files will remain installed in /root/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/sqlite3-1.4.2 for inspection.
Results logged to /root/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/extensions/x86_64-linux/2.7.0/sqlite3-1.4.2/gem_make.out
なんかエラーになった。
sqlite3がないと言われている?
それのインストールコマンドが記載されているので、実行してみる。
(yumでインストールしなさいということだろうと。)
[root@localhost ~]# yum install sqlite-devel
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
281 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ sqlite-devel.x86_64 0:3.7.17-8.amzn2.1.1 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===========================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================================================================
インストール中:
sqlite-devel x86_64 3.7.17-8.amzn2.1.1 amzn2-core 105 k
トランザクションの要約
===========================================================================================================================================================
インストール 1 パッケージ
総ダウンロード容量: 105 k
インストール容量: 366 k
Is this ok [y/d/N]: y
Downloading packages:
sqlite-devel-3.7.17-8.amzn2.1.1.x86_64.rpm | 105 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : sqlite-devel-3.7.17-8.amzn2.1.1.x86_64 1/1
検証中 : sqlite-devel-3.7.17-8.amzn2.1.1.x86_64 1/1
インストール:
sqlite-devel.x86_64 0:3.7.17-8.amzn2.1.1
完了しました!
[root@localhost ~]# gem install mailcatcher
Building native extensions. This could take a while...
Successfully installed sqlite3-1.4.2
Successfully installed daemons-1.4.1
Building native extensions. This could take a while...
Successfully installed thin-1.5.1
Successfully installed skinny-0.2.4
Successfully installed mailcatcher-0.8.1
Parsing documentation for sqlite3-1.4.2
Installing ri documentation for sqlite3-1.4.2
Parsing documentation for daemons-1.4.1
Installing ri documentation for daemons-1.4.1
Parsing documentation for thin-1.5.1
Installing ri documentation for thin-1.5.1
Parsing documentation for skinny-0.2.4
Installing ri documentation for skinny-0.2.4
Parsing documentation for mailcatcher-0.8.1
Installing ri documentation for mailcatcher-0.8.1
Done installing documentation for sqlite3, daemons, thin, skinny, mailcatcher after 1 seconds
5 gems installed
指定された「sqlite-devel」をインストールしたあとにmailcatcherのインストールを実行したところ、
エラーは出ずに終了した。
MailCatcherを起動する
MailCatcherを起動することで、送信されたメールを蓄積したり、蓄積したメールを閲覧できる画面にアクセスできるようになる。
MailCatcherのサイトで起動コマンドは「mailcatcher」と記載されているが、これで起動すると、メールを蓄積した画面にアクセスできなかったりした。
そこで以下のようなコマンドにした。
[root@localhost ~]# mailcatcher --ip=0.0.0.0
Starting MailCatcher v0.8.1
==> smtp://0.0.0.0:1025
==> http://0.0.0.0:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.
アクセスするためには、このサーバへの1080アクセスを許可しないといけない。
AWSのEC2だったので、そのサーバに設定しているセキュリティグループに「TCP 1080アクセス許可」を登録した。
ソースは、自分の固定IPとした。(自分しかアクセスできないようにした。)
固定IPを持っていない人は、0.0.0.0とする。
これで、このサーバのIPアドレスでアクセスした( http://(IPアドレス):1080 )ところ、MailCatcherの画面が表示された。
送信するメールを全てMailCatcherで取得するようにする
次に、移行したサービスから送られるを全てCatchしたいが、これをどうするか。
サーバから送られるメールを全て取得する方法もあるだろうが、
できれば対象のサービスからのメールのみとしたいが。。。
そのシステムがメールを送る部分を調べてみる。
PHPからのメール送信をポート1025にする
確認したいサービスはPHPなのだが、
1.PHPのシステムから、ポートを指定する。
2.php.ini にメール送信時のポート設定などを行う。
できれば、1の方法をとりたいが、ポートを設定できるような柔軟なつくりになってなかったので、
2の方法でやることにした。
このサーバでPHPのシステムはこれしか使っていなかったので、結果的に問題なかった。
php.iniに[mail function]という設定があった。
sendmail_path = /usr/sbin/sendmail -t -i
という行があるので、これをコメントアウト(左端に「;」を挿入)して、以下を追加した。
sendmail_path = /usr/bin/env /root/.rbenv/shims/catchmail --ip 0.0.0.0
SMTP = 127.0.0.1
smtp_port 1025
- 「/usr/bin/env」はこういうもんらしい。初めて見たけど。
- 「/root/.rbenv/shims/catchmail」はgem installでmailcatcherインストール時に一緒にインストールされたcatchmailのパスを指定する。どこにあるかは、「which catchmail」すれば出てきた。
- そういえば、「/root」配下にrbenvでrubyを入れてしまったので、上の設定をしてもメールをcatchmailを叩けず(phpシステムからcatchmailを叩くにはapacheがreadできないといけない)ので、権限なしとなってしまったのが原因だった。
セキュリティ的には問題があるが、apacheがcatchmailにアクセスできるように権限を設定した。
php.iniを修正したので、apacheをリロード。
この設定で動くことを確認するまで、以下のような認識をしていたが、間違いだったっぽい。
- ポートを指定するだけで、勝手にmailcatcherに送られると思っていたが、そうじゃなかった。おそらく、1025を指定してMTAに渡してしまっていたのかも。host(SMTP = 127.0.0.1)の設定が必要だったっぽい。
- ポートとhostを設定すれば、MTAではなくmailcatcherに渡してくれると思ったが、それもダメだった(この理由はよくわかっていない。。。)。メールの渡し先としてmailcatcherを直接指定する必要があった。
この場合、以下のように指定すればいいとのことだった。
/usr/bin/env /root/.rbenv/shims/catchmail --ip 0.0.0.0
mailcatcherではなくcatchmail。受け取り用のモジュールなのかな?
「–ip 0.0.0.0」がないと、正常に受け取れないっぽい。mailcatcher起動時も同様の設定をしているが、「0.0.0.0」はおそらく「誰でもOK(IPでの制限はなし)」ということなのかなぁと。でも単純なIP制限じゃなさそう。
外部から1025へのアクセスは許可していないので、特に厳しく制限しなくても良いと判断。
最後に
上記の設定で、テストしたかったPHPシステムから送ったメールが全てmailcatcherに入るようになった。
懸念として、以下が残った。
- テスト環境なので、サーバ自体を停止することもあるが、サーバ自体を起動したときにmailcatcherを起動しないと、メール送信時にエラーになるので、起動時に必ずmailcatcherも起動する。
サーバ起動時に自動起動すればいいのだけど、ちょっと試したところ泥臭いことになりそうで、かつテストを進めたかったので、一旦やめた。
- mailcatcher起動時のipの設定「–ip=0.0.0.0」の真意がよくわからなかった。
「–http-ip」と「–smtp-ip」という設定もあり、web受け口とメール受け口それぞれ設定できるよう。
これを指定しないとデフォルトの値が設定されるが、それだとメールを受け取らないだけでなくweb側もアクセスできなかった。通常のIP制限ならアクセス元IPを設定すればいいが、アクセス元IPを設定してもダメだった。
ということで、この設定のちょっと真意がわからなかった。。。
- rbenvは非常に便利だが、インストールしたユーザに紐づいてしまうみたい。もしかしたら、ユーザに依存しないようなインストールの仕方もありそうに思うので、mailcatcherを今後も使えそうなら、この辺の詳細を理解しておく必要がありそう。
時間があったら、改めて調査してみたい。