テスト用の “catch all” メールサーバ

グローバルソリューション事業部の平田です。

一般的にアプリケーションの開発段階ではダミーデータを利用しますが、データ中にある「ダミー」のメールアドレスには送りたくないがメールの送信のテストを行う、最終確認に本番データを投入してテストを行う場合など、「モック」のSMTPサーバが必要になってきます。

今回は、そのような用途に使えるソフトウェア・サービスを紹介したいと思います。

MailCatcher

SMTPサーバとしてメールを受信して、ウェブインターフェイスから確認するツールです。

mailcatcher

去年の秋以降コミットがなく継続性に不安がありましたが、今年に入ってからは順調にコミットされているため当面は問題無さそうです。また、今年初め頃は eventmachine の新しいバージョン (1.0.4) との相性により正常に動作しませんでしたが、現在では解決されているようです。

複数人で利用するというよりは、開発中に個人単位で利用するという位置づけのようです。

インストール方法

gem コマンド一発でmailcatcherコマンドをインストール可能です。(必要に応じて su/sudo してください。)

起動方法

オプションを付けずに起動すると、localhost でlistenします。

Railsの設定

環境ごとの設定ファイル (config/environments/*.rb) や初期化スクリプト (config/initializer/*.rb) にActionMailerの設定を記載します。以下は config/environments/development.rb の設定例です。

Listenするアドレスの設定

ローカル以外からのアクセスを受け付ける必要がある場合や、ポートを変更したい場合には、オプションで指定することが出来ます。IPアドレスを 0.0.0.0 (INADDR_ANY) とした場合、全てのインターフェイスで listen します。

注意点

認証機能は用意されていないため、ローカル以外からのアクセスを許可する場合には第三者からアクセスされる可能性があります。

Mailtrap

MailCatcherのASP版のようなサービスです。スタイルはMailCatcherと同じく、SMTPで受信したメールをブラウザで表示します。

MailCatcherの代替として利用するレベルであれば無料プランで十分ですが、有料プランでは便利な機能 (複数の受信箱の設定、複数アカウントでアクセス可能、メール転送) が用意されていますので、チームで利用するには検討しても良いでしょう。

mailtrap_inbox

Railsの設定

設定画面で「Ruby on Rails」を設定すると設定ファイル (config/environments/*.rb) 用のコードがそのまま表示されるため、コピー・ペーストで完了します。

mailtrap_settings

ただし、このファイルは一般的にVCSの管理対象となるため、少なくともパスワードは config/secrets.yml に記載しておくのが良いでしょう。

ここに記載した maildrop_password は、Rails.application.secrets.maildrop_password で取得することができます。

注意点

SMTP/Webアクセスとともに通信はTLS (SSL) 化されますが、外部サーバに対してデータが送信されるため、機密性が要求される場合にはポリシーを確認・決定しておく必要があります。(たとえば、最終確認の際に実データを利用する場合などには慎重になるべきです。)

Postfix

最後はPostfixの設定によって、宛先に拘わらず全てのメールを単一のアドレスに送信する方法を紹介します。Postfix ではあるドメイン名に対する “catch-all” の指定は可能ですが、「全てのドメイン」に対して指定する場合にはやや工夫が必要です。

求める機能と実現方法

まずは、求める機能を明確にします。

  • ローカル宛てのメールは、全てサーバ管理者宛 (hoge-admin@clara.ad.jp) に転送する
  • それ以外の外部向けのメールは、全て “catch all” 専用のアドレス (hoge-catch-all@clara.ad.jp) に転送する
  • 本来の宛先には一切送信しない

Postfixの設定

最初は virtual_alias_domains, virtual_alias_maps を利用して “catch all” を実現しようと考えていましたが、上手くいかない (メールがループしてしまう) ため、次のような方法で実現することにしました。(参考: Postfix DEV Catch all email forward to specific address)

  • 全てのメールについて、recipient_bcc_maps でBCC (blind carbon copy) 送付先を追加する
  • 特定の送付先については、transport_maps で SMTP サーバを指定する
  • 本来の宛先に送られるメールは、transport_maps で全て破棄する

main.cf に recipient_bcc_maps と transport_maps の設定を行います。

このサーバ自身を宛先とするメール (任意@server.hostname) は hoge-admin@clara.ad.jp に、それ以外は hoge-catch-all@clara.ad.jp にBCCします。

特定のアドレスは、トランスポートとして smtp.server に SMTP で送信、それ以外の全てのアドレス (“*”) は破棄します。(上でBCCを追加しただけでは本来の宛先にまで送られてしまうため、”*” に対する破棄設定は必要です。)

最後にpostmapを実行して、Postfixを再起動します。

Railsの設定

まとめ

今回は、開発時に便利な「モック」SMTPサーバについて説明しました。

クララオンラインでは、MailCatcherとPostfixの両方を利用しており、開発時には前者を、ステージング環境 (開発者以外の社員も利用するため) などでは後者の方法を採用しています。

Mailtrap を利用しないのはコストの問題ではなく、外部に出したくない業務関連の情報を取り扱っているという理由です。今後、業務システムではない一般的なウェブサービスを開発する際には利用したいと思っています。(個人的な開発には便利に利用しています。)

Share on LinkedIn
LINEで送る
Pocket

平田

平田

本業はインフラエンジニアだけど、最近はプログラミングやっています。