LoginSignup
28
28

More than 5 years have passed since last update.

mailcatcher を使って PHP のメール送信内容をテストする

Last updated at Posted at 2014-03-23

ダミーの SMTP サーバーを簡単に立てることができる gem に mailcatcher というものがあります。

mailcatcher は受け取ったメッセージを API 経由で取得することができます。これを使って mb_send_mail 関数で想定した内容でメールが送信されているかテストします。

まずは mailcatcher をインストールして、PHP が mailcatcher を使うように設定します。設定方法はこちらの中ほど以降に書いてあります。

下記はテスト対象とするメール送信を行うだけのクラスです。

Mail.php
<?php

class Mail{
  public function send($to, $subject, $body){
    mb_language('ja');
    mb_internal_encoding('UTF-8');
    mb_send_mail($to, $subject, $body);
  }
}

そして下記は Mail クラスをテストする PHPUnit のテストコードです。

MailTest.php
<?php

require_once 'Mail.php';

class MailTest extends PHPUnit_Framework_TestCase{
  public function testSend(){
    /**
     * メールを送信する。
     */
    $mail = new Mail();
    $mail->send('email@example.com', 'タイトルです', '本文です。');

    /**
     * mailcatcher の API 経由でメッセージの一覧を取得する。
     */
    $messages = json_decode(file_get_contents('http://127.0.0.1:1080/messages'));

    /**
     * 一番新しいメッセージの詳細を取得する。
     */
    $message = json_decode(file_get_contents('http://127.0.0.1:1080/messages/' . $messages[0]->id . '.json'));

    /**
     * 宛先、タイトル、本文などをテストする。
     */
    $this->assertEquals('<email@example.com>', $message->recipients[0]);
    $this->assertEquals('タイトルです', $message->subject);
    preg_match_all('/\n\n(.*)/', $message->source, $matches);
    $this->assertEquals('本文です。', mb_convert_encoding($matches[1][0], 'UTF-8', 'ISO-2022-JP'));
  }
}

localhost の 1080 ポートの /messages にアクセスすると、mailcatcher が受け取ったメッセージの一覧を JSON で出力してくれます。また、 /messages/11.json のようにメッセージ ID を指定してアクセスすると、その ID のメッセージの詳細を出力してくれます。

28
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
28