MAMPとMailHogで簡単、Macのローカル環境でメール送信テスト

MAMP&MailHog

Macで何か開発中の初期段階で、ローカル環境でメール送信テストしたいな!なんて時ありますよね。

Googleでのローカルメール送信の設定は面倒になったようだし、わざわざMailChimpのAPIを使ってやるようなこともない…、そんなあなたに!

MailHogとmb_send_mail関数

紹介するのは、開発環境でのメール送信を捕捉してくれるオープンソースツール「MailHog」と、PHPのmb_send_mail関数、またはmail関数を使う方法です。

はじめに言っておくと、この方法ではメールは実際には送信されません。

メール送受信のエミュレーターを使うようなもので、Gmailなどの外部SMTPサーバーを使用せずに、ローカル環境でメール送信のテストが可能になります。

送受信内容はツール画面かターミナルから確認することができます。

開発中のアプリケーションでちょっとしたメール送信機能をテストする際に便利です。

必要なもの

材料は以下の通りです。

  • Mailhog(オープンソースツール)
  • php.iniファイル(MAMP内)
  • メール送信用PHPコード

前提として、MAMPとHomebrewが入っていること。

実態はPHPのiniファイル変更とツールインストールしかやらないので、MAMPもHomebrewもいらないんですが。

Mailhogをインストール

まずはじめにMailHogをインストールします。

MailHogは、開発環境でのメール送受信を捕捉してくれるオープンソースツールです。実際にメールを送信することなく、送信したメールをWeb画面で確認できます。

MailHogのインストール

Homebrewを使ってMailHogをインストールしましょう。

ターミナルを開いて、以下のコマンドを入力します。

brew install mailhog 


MailHogの起動

インストール後、以下のコマンドでMailHogを起動します。

mailhog

MailHogを終了

起動が確認できたら、一旦ターミナル上でMailHogを終了しておきます。

ターミナルで「Ctrl + C」を押して、MailHogプロセスを終了させます。

php.iniの設定変更

次に、MAMPのphp.iniファイルを編集します。

MAMPには複数バージョンのPHPが入っているので、バージョンに合わせて以下の場所を確認しましょう。

/Applications/MAMP/bin/php/php[バージョン]/conf/php.ini

場所がわかったらphp.iniファイルを開きます。

sendmail_pathを変更

sendmail_pathの設定を変更します。

僕はMAMPではPHP8.2.0を使っているので、一部iniファイルの中を抜き出すと下記のようなコードになってます(してます)。

/Applications/MAMP/bin/php/php8.2.0/conf/php.ini
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
;smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = ほにゃほにゃ@gmail.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "/opt/homebrew/bin/mailhog sendmail"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail().
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; The path to a log file that will log all mail() calls. Log entries include
; the full path of the script, line number, To address and headers.
;mail.log =
; Log mail to syslog (Event Log on Windows).
mail.log = syslog

変更するのは「sendmail_path 」の部分です。

ターミナルから下記コマンドを実行してMailHogのインストールパスを確認してください。

which mailhog

僕の場合は「/opt/homebrew/bin/mailhog sendmail」と出るので、sendmail_pathの部分は以下のようになります。

sendmail_path = "/opt/homebrew/bin/mailhog sendmail"

php.iniのsendmail_pathをMailHogのSMTPサーバーに設定することで、mb_send_mail()関数、またはmail()関数からのすべてのメールをMailHogが捕捉します。

また、MailHogはデフォルトでポート1025にてSMTPサーバーを起動します。

php.iniの初期設定はsmtp_port = 25とありますが、MailHogと競合はしません。上の例ではコメントアウトしてますが、特に使うこともないのでそのままでも大丈夫です。

変更が終わったら保存します。

メール送信用のコードを用意する

メール送信をおこなう登録フォームと処理コードを用意します。

form.php:登録フォーム
send_mail.php:メール送信処理

form.php
<form action="send_mail.php" method="POST">

<label for="name">ユーザー名</label>
<input type="text" id="name" name="name">

<label for="email">メールアドレス</label>
<input type="email" id="email" name="email">

<label for="password">パスワード</label>
<input type="password" id="password" name="password">

<button type="submit">登録する</button>

</form>
send_mail.php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
	$name = $_POST["name”];
	$email = $_POST["email”];
	$password = $_POST["password"];

	// 言語設定
        mb_language('ja');
        mb_internal_encoding('UTF-8');

        // メール送信内容
        $subject = '仮登録の確認';
        $message = "キミはいま仮登録の状態なんだ!\n以下のリンクをクリックして登録を完了してくれよな!”;
        $mailfrom = 'noreply@example.com';

        // ヘッダーの設定
        $headers = ['From' => $mailfrom, 'Content-Type' => 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding' => '8bit'];

        // メール送信
        if (!mb_send_mail($email, $subject, $message, $headers, '-f' . $mail from)) {
            // メール送信失敗時のエラーハンドリング
            $errors[] = "認証メールの送信に失敗したぜ。”;
            error_log("メール送信に失敗したぜ。チェだぜ。”);
        }
}

MailHogの起動とMAMPの再起動

MailHogの起動

準備が整ったらMailHogを起動します。

mailhog

MAMP再起動(PHPの設定再読み込み)

php.iniを編集した後、MAMPのサーバーを再起動します。
これでphp.iniが再読み込みされます。

MAMPはサーバーの停止、起動だけでは反映されないこともあるため、念のためMAMP自体を再起動しておくと確実です。

MailHogでメール送信を確認する

MailHogを起動、MAMPを再起動した後、Webブラウザでhttp://localhost:8025にアクセスしましょう。MailHogのWebインターフェースが表示され、送信されたメールを確認できます。ターミナでも確認可能です。

http://localhost:8025

メール送信後

実際にフォームからメールを送信し、http://localhost:8025を確認すると以下のような感じで表示されます。

無事メールの送信内容は確認できましたか?

問題があればPHPのエラーログを確認しましょう。
MAMPの場合、ログファイルは通常以下の場所にあります。

/Applications/MAMP/logs/php_error.log

簡易的ではありますが、簡単に確認する分にはこれで十分かも知れませんね。