developers blog

mailcatcher を利用して sendmail で送信したメールの内容を確認する (docker)

はじめに

docker で構築した php のローカル環境から、mb_send_mail 関数で送信するメールの内容を確認したいとき、mailcatcher を利用することで、ブラウザ上でメールの内容が簡単に確認できます。

mailcacher について

mailcatcher は、ruby で作成されたアプリケーションです。シンプルな SMTP サーバーを立て、送信したメールの内容をブラウザ上で確認できます。php から使用する場合は、php.ini の sendmail_path を変更するだけで簡単に設定できます。外部にメールを送信することがないため、mb_send_mail で送信されたメールの内容を確認する時に非常に便利です。

mailcacher

使い方

docker-compose を利用し、php からメールを送信するだけの簡単な環境を作成します。

1root
2docker
3  ┃   ┗ php
4  ┃       ┣ Dockerfile
5  ┃       ┗ php.ini
6  ┣ www
7  ┃   ┗ index.php
8  ┗ docker-compose.yml

以下のような docker-compose.yml ファイルを作成します。mailcatcher のコンテナは Docker hub で公開されているイメージを使用します。サービス名は php から参照するときに分かりやすい名前にしておきます。(ここでは mail としておきます)

docker-compose.yml
1version: "3"
2services:
3  mail:
4    image: schickling/mailcatcher
5    ports:
6      - "1080:1080"
7      - "1025:1025"
8  php:
9    build: ./docker/php
10    ports:
11      - "80:80"
12    volumes:
13      - ./www:/var/www/html

php の Dockerfile

gem を使用するために必要な ruby 関連のパッケージを先にインストールし、その後 gem を使用してmailcatcher をインストールします。
/usr/local/etc/php/ に php.ini をコピーし設定を上書きします。

1FROM php:7.2-apache
2
3RUN apt-get update -qq \
4  && apt-get install -y \
5    ruby \
6    ruby-dev \
7    rubygems \
8    libsqlite3-dev \
9  && apt-get autoremove \
10  && apt-get clean
11RUN gem install mailcatcher
12
13COPY ./php.ini /usr/local/etc/php/

php.ini で、sendmail のパスに catchmail を設定します。
--smtp-ip には、docker-compose.yml で設定した mailcatcher コンテナのサービス名(ここでは mail )を指定します。
メール送信用にエンコーディングも指定しておきます。

php.ini
1[Date]
2date.timezone = "Asia/Tokyo"
3
4[mbstring]
5mbstring.internal_encoding = "UTF-8"
6mbstring.language = "Japanese"
7
8[mail function]
9sendmail_path = /usr/bin/env catchmail --smtp-ip mail --smtp-port 1025

index.php、には mb_send_mail 関数を使用してメール送信するテストプログラムを記述します。

index.php
1<?php
2$to = 'mailcatcher@test.com';
3$subject = 'これはmailcatcherのテストです。';
4$message = 'mailcatcherのテスト';
5$additional_headers = array(
6  'From' => 'noreply@test.com'
7);
8
9if (!mb_send_mail($to, $subject, $message, $additional_headers)) {
10  print_r('メールの送信に失敗しました。');
11} else {
12  print_r('メールを送信しました');
13}

サービスをビルドし、 http://192.168.99.100:1080 にアクセスすると以下のような画面が表示されます。まだメールを送信してないため中身はからっぽです。
※アドレスの 192.168.99.100 の部分は、環境によって異なります。

mailcacher のメール送信前のメール一覧画面。メールは何も表示されていない。

http://192.168.99.100 にアクセスし、「メールを送信しました」と表示された後、もう一度 http://192.168.99.100:1080 にアクセスすると、送信したメールが画面に表示されます。

mailcacher のメール送信後のメール一覧画面。1件メールが表示されている。