Parallels Desktop 25%OFFセール中Check!

MacのPHP開発環境でメールの送信テスト MailHogの使い方

MailHogの使い方

Macの自宅サーバでPHPの開発環境を構築したとき、なぜかメールの送信ができないということがあります。安心してください。できなくて当たり前なんです。

この記事では、PHPの開発環境でメールの送信テストをするためのツールMailHogの使い方を解説します。

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/ にアクセスしてください。先ほど送信したメールのリストが表示されます。

MailHog 01

リストをクリックするとメールの内容を確認することができます。 

MailHog 02

上部のアイコンから、メーッセージの削除、EML形式でのダウンロード、SMTPサーバへのリリースなどができます。

障害テスト

左下の「Enable Jim」ボタンをクリックすると、Jimが有効になります。JimとはChaos Monkeyのことで、Chaos Monkeyとはサービスに対して仮想的な障害を発生させるツールのことです。

Jimは人あるいは猿の名前でしょうか。Jimが現れると障害が発生するということなので、厄介者であること確かです。

MailHog 03

「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)を使うように設定できます。設定方法は次のセクションで説明します。

PR

無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。

MailHogの設定

MailHogの設定項目

MailHogの設定は、環境変数またはコマンドラインで指定できます。

環境変数コマンドライン初期値説明
MH_API_BIND_ADDR-api-bind-addr0.0.0.0:8025HTTP APIのバインドインターフェースとポート
(例:0.0.0.0:8025|:8025
-api-hostMailHog UIが接続するAPI URL
(例:http://some.host:1234
MH_AUTH_FILE-auth-fileWeb UIでユーザ認証をするときのusername:bcryptpw形式のマッピングファイル
MH_CORS_ORIGIN-cors-originAPIエンドポイントに返すAccess-Control-Allow-Originヘッダ
MH_HOSTNAME-hostnamemailhog.exampleEHLO/HELOおよびメッセージIDに使用するホスト名
-invite-jimジムを招待する(障害テスト)
-jim-accept0.99メールが受理される確率
-jim-disconnect0.005切断される確率
-jim-linkspeed-affect0.1リンク速度に影響を与える確率
-jim-linkspeed-max10240最大リンク速度(kbps)
-jim-linkspeed-min1024最低リンク速度(kbps)
-jim-reject-auth0.05認証(AUTH)を拒否する確率
-jim-reject-recipient0.05受信者(RCPT TO)を拒否する確率
-jim-reject-sender0.05送信者(MAIL FROM)を拒否する確率
MH_MAILDIR_PATH-maildir-pathストレージタイプがmaildirのときのMaildirパス
MH_MONGO_COLLECTION-mongo-collmessagesメッセージストレージ用のMongoDBコレクション名
MH_MONGO_DB-mongo-dbmailhogメッセージ保存用のMongoDBデータベース名
MH_MONGO_URI-mongo-uri127.0.0.1:27017MongoDBのホストとポート
MH_OUTGOING_SMTP-outgoing-smtp送信SMTPサーバーを定義するJSONファイル
MH_SMTP_BIND_ADDR-smtp-bind-addr0.0.0.0:1025SMTPのバインドインターフェースとポート
(例:0.0.0.0:1025|:1025
MH_STORAGE-storagememoryメッセージの保存場所
memory|mongodb|maildir
MH_UI_BIND_ADDR-ui-bind-addr0.0.0.0:8025Web UIのバインドインターフェースとポート(例:0.0.0.0:8025|:8025
MH_UI_WEB_PATH-ui-web-pathWeb 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。

でわでわ

MailHogの使い方

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次