MailCatcherをインストールして使ってみた

投稿者: | 2021年12月18日

メールサービスのサーバが古くなり、新しいサーバにそのシステムを引っ越しする必要があった。

ただ、新しいサーバでちゃんと動くのかどうか。動かなかった場合、大きなトラブルになる。

とはいえ「網羅する(だろう)テストケースを実施すればいいだろう」と思っていたが、システムトラブルは想定外で発生する。

そういう意味では、やりすぎなほどテストするべきとの思いもあり、なんとかテストする方法はないかと思ってたところ、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を今後も使えそうなら、この辺の詳細を理解しておく必要がありそう。

時間があったら、改めて調査してみたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)