📧

DockerでMailcatcherを使う!

2023/03/11に公開

開発段階で実際のメールサーバーは用いずに、メールが送受信できるかを確認したり、メールの文面を確認するのに便利なMailCatcherというライブラリがあります。今回の記事ではこのMailCatcherをDockerで使用する方法を解説していきます。

MailCathcer(メールキャッチャー)とは

まず、MailCatcherとは何か?ということをもう少しだけ話していきます。
MailCatcherとはシンプルなSMTPサーバーです。メールを送るにはメールサーバーというものがメールの送受信の役割を担ってくれています。MailCatcherはメールサーバーのように働き、ただし実際にアドレスにメールは送らず、メール文や、どのアドレスに送る処理がなされたのかということをWeb上で確認することができます。

MailCatcher自体はrubyのgemですが、SMTPサーバーにアクセスできる環境があれば、言語問わずメールの確認に使用できるようです。

今回はDockerを用いますが、Railsのアプリ内にMailCathcerを入れて使う場合には以下リンクがわかりやすいです!
【Rails】「mailcatcher」を使ってテストメールを送信/受信する

なぜDockerを用いたか?

最初は上記リンクのようにRailsアプリケーション内でGemをインストールしようかと思ったのですが、MailCatcherはメールサーバーの役割を果たしてくれるだけなので、独立したコンテナとして起動した方が使い勝手がいいのではないかと思いました。その上でメールを用いる色々なアプリケーションにおいて、ローカル環境ではMailCatcherでメールを送るという設定を書いておけば、あとはMailCatcherのコンテナを立ち上げるだけでメールを確認できるのです。

独立したコンテナとして起動する際の、イメージは以下のような感じです。

DockerでMailCatcherを使う!

以下2つのリンクのコードをコピペしたcompose.ymlを新たに作成することで、簡単にMailCatcher自体は起動することができました。
DockerでMailcatcherを使ってRuby on Rails開発環境のメールを受信する
Rails Docker環境でメール送信の動作確認 (mailcatcher)

しかし、メールを送るRailsのアプリケーションもDockerで動かしていたため、コンテナ間のネットワークの関係で、メールが正常にMailCatcherに届きませんでした。

最終的に以下のコードで正常にMailCatcherでメールを確認できるようになりました。コンテナ間の通信ができるようにnetworksを記述しています。例としてsnowboardというアプリからメールを送ることを想定したコードになっています。

compose.yml
services:
  mailcatcher:
    image: schickling/mailcatcher
    container_name: mailcatcher
    ports:
      - '1080:1080'
      - '1025:1025'
    networks:
      - default
      - snowboard_default #snowboardアプリのネットワーク名
networks:
  snowboard_default:
    external: true

Dockerを用いてMailCathcerを使用したい場合には、以下コマンドでメールを送るアプリが動いている既存のコンテナのネットワークを確認する。そしてそれを上記のコードに当てはめていけば、簡単に使用できると思います!

docker network ls

このやり方であれば、メールを確認したいアプリが増えても上記compose.ymlのnetworks部分に増えたネットワークを追記してあげれば、問題なく動作すると思うので、とっても便利だなと思っています。
参考:composeのネットワーク機能

Rails側の設定

ここまでDockerでMailCatcherを動かす話だけしてきていましたが、Railsでのメール送信の設定も変えないとMailCatcherでメールは確認できません。
developmentモードだけメールの送信をMailCatcherにするために以下のように変更してください。

config/environments/development.rb
config.action_mailer.delivery_method = :smtp
  #↓ここのaddressの部分だけ修正した!
config.action_mailer.smtp_settings   = { address: 'mailcatcher', port: 1025 }

このときaddressの部分はcompose.ymlのコンテナ名に変更します。デフォルトではaddressはlocalhostになっているはずです。このlocalhostを上記compose.ymlで記述したservice名であるmailcatcherに変更するって感じです。

メールの確認

あとは http://localhost:1080 を開いてメールの内容を確認することができるというだけです。
使い方は簡単にわかると思いますが、一応公式へのリンクも貼っておきます。(公式リンク

最後に

コードの部分をほぼコピペしてコンテナを起動すれば、Dockerにあまり詳しくなくても、考えずにMailCatcherを使えるようになるのではないかと思うので、是非使ってみてください!

Discussion