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ファイルの中を抜き出すと下記のようなコードになってます(してます)。
[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 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>
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
簡易的ではありますが、簡単に確認する分にはこれで十分かも知れませんね。