ダミーの 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 のメッセージの詳細を出力してくれます。