Macの自宅サーバでPHPの開発環境を構築したとき、なぜかメールの送信ができないということがあります。安心してください。できなくて当たり前なんです。
この記事では、PHPの開発環境でメールの送信テストをするためのツールMailHogの使い方を解説します。
- Mac mini (M1, 2020)
- macOS Sonoma 14.5
なぜメールを送信できないのか
自宅サーバからメールが送信できないのは、インターネット接続プロバイダがOP25B(Outbound Port 25 Blocking)を導入し、25番ポートでのメール送信を禁止しているためです。これは、マルウェア感染や不正アクセスによる迷惑メール送信を防ぐための措置です。
25番以外のポートを使う設定で回避可能ですが、あなたのパソコンがマルウェアに感染しない保証はないのでおすすめしません。代わりに、メール送信テストツールのMailHogを使用しましょう。
MailHogとは
MailHogはローカルの開発環境でメールの送信テストをするためのツールです。実際にメールを送信することなく、メール送受信のシミュレートをすることができます。
MailHogの機能
- Web UI: メールのメッセージ(プレーンテキスト、HTML、またはソース)をウェブブラウザで表示して確認することができます。
- HTTP API: APIを使用してメールを取得、一覧表示、削除できます。
- 拡張SMTPのサポート: ESMTPに対応し、SMTP認証やPIPELININGをサポートします。
- 障害テスト: メールの送受信に仮想的な障害を起こすことができます。
- メッセージの保存: メールメッセージはメモリに保存されます。メッセージの永続化のためにMongoDBまたはファイルベースで保存することも可能です。
- マルチパートMIMEのサポート: 添付ファイルなど個々のMIMEパーツをダウンロードできます。
- メールのリリース: メールを実際のSMTPサーバにリリースして配信することもできます。
MailHogのインストール
MacにMailHogをインストールするにはHomebrewを使います。まだHomebrewを導入していないあなたは下記の記事をご覧ください。
ターミナルでコマンドbrew install mailhog
を実行しましょう。
brew install mailhog
以上でMailHogのインストールは完了です。簡単でしたね。
PHPの設定変更
PHPスクリプトからメールを送信したときにMailHogを経由するように、PHPの設定を変更します。
PHPの設定ファイルphp.ini
の場所は以下のコマンドで確認できます。複数のバージョンのPHPをインストールしている場合は、それぞれの設定ファイルを変更しましょう。
php --ini
php.ini
を開いたら[mail function]
セクションを見つけてください。
そして、sendmail_path
の値を/opt/homebrew/bin/mailhog sendmail
にします。環境によってはmailhog
のパスが違うかもしれません。which mailhog
コマンドで確認しましょう。
[mail function]
; For Win32 only.
; https://php.net/smtp
SMTP = localhost
; https://php.net/smtp-port
smtp_port = 25
; For Win32 only.
; https://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; https://php.net/sendmail-path
sendmail_path = "/opt/homebrew/bin/mailhog sendmail"
設定を変更したらApacheを再起動して設定を反映させましょう。
MailHogの起動と終了
自動起動
MailHogを起動するには以下のコマンドを実行します。このコマンドを実行するとMailHogが起動し、Macの起動時にMailHogが自動起動するように設定されます。
brew services start mailhog
MailHogを終了するには以下のコマンドを実行します。このコマンドを実行するとMailHogが終了し、自動起動設定が解除されます。
brew services stop mailhog
一時的な起動
自動起動設定を変更せずにMailHogを起動するには以下のコマンドを実行します。
mailhog
終了するにはcontrol+Cキーを押します。
MailHogの使い方
テスト用スクリプトの作成
まず、メール送信テスト用のPHPスクリプトを適当に作ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>メール送信テスト</title>
</head>
<body>
<form action="./form.php" method="post">
<label for="email">宛先メールアドレス</label>
<input type="text" id="email" name="email">
<label for="subject">件名</label>
<input type="text" id="subject" name="subject">
<label for="body">本文</label>
<textarea id="body" name="body"></textarea>
<input type="submit" value="送信">
</form>
<style>
label,input,textarea {
display: block;
}
input,textarea {
width: 500px;
margin-bottom: 20px;
}
textarea {
height: 100px;
}
</style>
<?php
if (isset($_POST['email'])) {
mb_send_mail($_POST['email'], $_POST['subject'], $_POST['body'], array('From' => 'webmaster@example.com'));
}
?>
</body>
</html>
このフォームを使ってメールを送信してみましょう。MailHogが受信してくれているはずです。
Web UIで確認する
ウェブブラウザで http://localhost:8025/ にアクセスしてください。先ほど送信したメールのリストが表示されます。
リストをクリックするとメールの内容を確認することができます。
上部のアイコンから、メーッセージの削除、EML形式でのダウンロード、SMTPサーバへのリリースなどができます。
障害テスト
左下の「Enable Jim」ボタンをクリックすると、Jimが有効になります。JimとはChaos Monkeyのことで、Chaos Monkeyとはサービスに対して仮想的な障害を発生させるツールのことです。
「Enable Jim」ボタンをクリックしました。いろんな障害の発生する確率が表示されます。このパーセンテージの設定は変更することができます。
「Disable Jim」ボタンをクリックするとJimは帰ります。
APIで確認する
APIでメッセージを確認することもできます。APIのエンドポイントはhttp://localhost:8025/api
です。
メールの一覧を取得してみましょう。ターミナルで次のコマンドを実行するとJSON形式で値が返ってきます。
curl http://localhost:8025/api/v2/messages
特定のメッセージだけを取得するならば以下のコマンドを実行します。APIのバージョンがv1になるので注意してください。
curl http://localhost:8025/api/v1/messages/<message_id>
メッセージを削除するコマンドです。これもAPIバージョンはv1です。
#すべてのメッセージを削除
curl -X DELETE http://localhost:8025/api/v1/messages
#特定のメッセージを削除
curl -X DELETE http://localhost:8025/api/v1/messages/<message_id>
メッセージの保存場所
送受信したメッセージは、初期設定ではメモリに保存されます。つまり、MailHogを終了すれば消えてしまうということです。
MailHogを終了してもメッセージを残したい場合は、保存場所としてMongoDBまたはファイル(Maildir)を使うように設定できます。設定方法は次のセクションで説明します。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
MailHogの設定
MailHogの設定項目
MailHogの設定は、環境変数またはコマンドラインで指定できます。
環境変数 | コマンドライン | 初期値 | 説明 |
---|---|---|---|
MH_API_BIND_ADDR | -api-bind-addr | 0.0.0.0:8025 | HTTP APIのバインドインターフェースとポート (例: 0.0.0.0:8025 |:8025 ) |
-api-host | MailHog UIが接続するAPI URL (例: http://some.host:1234 ) | ||
MH_AUTH_FILE | -auth-file | Web UIでユーザ認証をするときのusername:bcryptpw 形式のマッピングファイル | |
MH_CORS_ORIGIN | -cors-origin | APIエンドポイントに返すAccess-Control-Allow-Originヘッダ | |
MH_HOSTNAME | -hostname | mailhog.example | EHLO/HELOおよびメッセージIDに使用するホスト名 |
-invite-jim | ジムを招待する(障害テスト) | ||
-jim-accept | 0.99 | メールが受理される確率 | |
-jim-disconnect | 0.005 | 切断される確率 | |
-jim-linkspeed-affect | 0.1 | リンク速度に影響を与える確率 | |
-jim-linkspeed-max | 10240 | 最大リンク速度(kbps) | |
-jim-linkspeed-min | 1024 | 最低リンク速度(kbps) | |
-jim-reject-auth | 0.05 | 認証(AUTH)を拒否する確率 | |
-jim-reject-recipient | 0.05 | 受信者(RCPT TO)を拒否する確率 | |
-jim-reject-sender | 0.05 | 送信者(MAIL FROM)を拒否する確率 | |
MH_MAILDIR_PATH | -maildir-path | ストレージタイプがmaildirのときのMaildirパス | |
MH_MONGO_COLLECTION | -mongo-coll | messages | メッセージストレージ用のMongoDBコレクション名 |
MH_MONGO_DB | -mongo-db | mailhog | メッセージ保存用のMongoDBデータベース名 |
MH_MONGO_URI | -mongo-uri | 127.0.0.1:27017 | MongoDBのホストとポート |
MH_OUTGOING_SMTP | -outgoing-smtp | 送信SMTPサーバーを定義するJSONファイル | |
MH_SMTP_BIND_ADDR | -smtp-bind-addr | 0.0.0.0:1025 | SMTPのバインドインターフェースとポート (例: 0.0.0.0:1025 |:1025 ) |
MH_STORAGE | -storage | memory | メッセージの保存場所 ( memory |mongodb |maildir ) |
MH_UI_BIND_ADDR | -ui-bind-addr | 0.0.0.0:8025 | Web UIのバインドインターフェースとポート(例:0.0.0.0:8025 |:8025 ) |
MH_UI_WEB_PATH | -ui-web-path | Web UIのサブディレクトリ(先頭・末尾にスラッシュはつけない) |
MailHogの設定方法
以下の3通りの設定方法を解説します。
- コマンドラインで指定: 最もシンプルでわかりやすい設定方法です。
- 環境変数で指定: 起動するときにいちいちオプションを指定しなくてもいい便利な設定方法です。
- .plistファイルを編集:
brew services start mailhog
コマンドで起動する場合の設定方法です。
コマンドラインで設定する
コマンドラインで設定を変更するには、MailHogの起動時に次のようにオプションを指定します。
mailhog -storage maildir -maildir-path /Users/<ユーザ名>/MHMaildir
起動コマンドに続けて、コマンドラインオプションをスペースで区切って記述します。上記はメッセージの保存方法をmaildirに設定する例です。
でも、起動するたびにオプションを指定するのは面倒ですよね。ちゅーことで、環境変数で設定してみましょう。
環境変数で設定する
環境変数を設定するにはシェルの設定ファイルを編集します。
まずは自分が使っているシェルを確認しましょう。ターミナルでecho $SHELL
コマンドを実行します。
echo $SHELL
結果が/bin/zsh
ならばzsh、/bin/bash
ならばbashを使っています。そして、zshの設定ファイルは/Users/<ユーザ名>/.zshrc
で、bashの設定ファイルは/Users/<ユーザ名>/.bash_profile
になります。
自分が使っているシェルがわかったら、その設定ファイルを編集しましょう。次のように記述します。
export MH_STORAGE=maildir
export MH_MAILDIR_PATH=/Users/<ユーザ名>/MHMaildir
このように設定しておくことで、MailHogを起動するときにいちいちオプションを指定せずに設定を変更することができます。
brew services を使う場合の設定方法
brew services start mailhog
コマンドで起動する場合は、homebrew.mxcl.mailhog.plist
ファイルを編集します。このファイルの場所を探すには、以下のコマンドを実行します。
brew --prefix mailhog
返ってきたディレクトリの下にhomebrew.mxcl.mailhog.plist
ファイルがあります。このファイルを開くと次のようになっています。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mailhog</string>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>Background</string>
<string>LoginWindow</string>
<string>StandardIO</string>
<string>System</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/mailhog/bin/MailHog</string>
<string>-api-bind-addr</string>
<string>127.0.0.1:8025</string>
<string>-smtp-bind-addr</string>
<string>127.0.0.1:1025</string>
<string>-ui-bind-addr</string>
<string>127.0.0.1:8025</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/opt/homebrew/var/log/mailhog.log</string>
<key>StandardOutPath</key>
<string>/opt/homebrew/var/log/mailhog.log</string>
</dict>
</plist>
18〜26行目、<string>...</string>
でくくられた文字列をつなげると次のようになります。これがMailHogの起動コマンドになります。
/opt/homebrew/opt/mailhog/bin/MailHog -api-bind-addr 127.0.0.1:8025 -smtp-bind-addr 127.0.0.1:1025 -ui-bind-addr 127.0.0.1:8025
これにならって、メッセージの保存方法をmaildirにする設定を追加すると、次のようになります。
<array>
<string>/opt/homebrew/opt/mailhog/bin/MailHog</string>
<string>-api-bind-addr</string>
<string>127.0.0.1:8025</string>
<string>-smtp-bind-addr</string>
<string>127.0.0.1:1025</string>
<string>-ui-bind-addr</string>
<string>127.0.0.1:8025</string>
<string>-storage</string>
<string>maildir</string>
<string>-maildir-path</string>
<string>/Users/username/MHMaildir</string>
</array>
さいごに
MacのPHP開発環境でメールの送信テストをするためのツールMailHogの使い方を解説しました。
MailHogを利用することで、ローカル環境で簡単にそして安全にメールの送信テストができますね。ありがとう、MailHog。
でわでわ
コメント