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 からメールを送信するだけの簡単な環境を作成します。

root
  ┣ docker
  ┃   ┗ php
  ┃       ┣ Dockerfile
  ┃       ┗ php.ini
  ┣ www
  ┃   ┗ index.php
  ┗ docker-compose.yml

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

docker-compose.yml
version: "3"
services:
  mail:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
  php:
    build: ./docker/php
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html

php の Dockerfile

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

FROM php:7.2-apache

RUN apt-get update -qq \
  && apt-get install -y \
    ruby \
    ruby-dev \
    rubygems \
    libsqlite3-dev \
  && apt-get autoremove \
  && apt-get clean
RUN gem install mailcatcher

COPY ./php.ini /usr/local/etc/php/

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

php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[mail function]
sendmail_path = /usr/bin/env catchmail --smtp-ip mail --smtp-port 1025

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

index.php
<?php
$to = 'mailcatcher@test.com';
$subject = 'これはmailcatcherのテストです。';
$message = 'mailcatcherのテスト';
$additional_headers = array(
  'From' => 'noreply@test.com'
);

if (!mb_send_mail($to, $subject, $message, $additional_headers)) {
  print_r('メールの送信に失敗しました。');
} else {
  print_r('メールを送信しました');
}

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

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

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

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