mailcatcher を利用して sendmail で送信したメールの内容を確認する (docker)
はじめに
docker で構築した php のローカル環境から、mb_send_mail 関数で送信するメールの内容を確認したいとき、mailcatcher を利用することで、ブラウザ上でメールの内容が簡単に確認できます。
mailcacher について
mailcatcher は、ruby で作成されたアプリケーションです。シンプルな SMTP サーバーを立て、送信したメールの内容をブラウザ上で確認できます。php から使用する場合は、php.ini の sendmail_path を変更するだけで簡単に設定できます。外部にメールを送信することがないため、mb_send_mail で送信されたメールの内容を確認する時に非常に便利です。
使い方
docker-compose を利用し、php からメールを送信するだけの簡単な環境を作成します。
1root 2 ┣ docker 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.yml1version: "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.ini1[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.php1<?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
の部分は、環境によって異なります。
http://192.168.99.100
にアクセスし、「メールを送信しました」と表示された後、もう一度 http://192.168.99.100:1080
にアクセスすると、送信したメールが画面に表示されます。