前回紹介したMailtrapに比べて機能は劣りますが、十分代わりとなるしかもオープンスース(つまり無料)のMailhogの紹介です。このプログラムと知り合ったのは、Laravelの最新バージョン8のsailのパッケージで使用されていたからです。sailDockerを使用して簡単に開発環境を作成できる素晴らしいものなのですが、Dockerの1つのコンテイナーとしてMailhogがインストールされます。sailの紹介は別の機会として、今回は単独でのインストールです。

インストール

まず、Mailhogはphpで作成されたプログラムでなく、Goの言語で書かれコンパイルされたバイナリのプログラムです。

以下がソースコードのレポジトリです。

https://github.com/mailhog/MailHog

しかし、ソースコードをコンパイルするやっかいなことは必要でありません。すでにコンパイルされたバイナリを以下からダウンロードできます。

https://github.com/mailhog/MailHog/releases/v1.0.0

この最新のリリースはもう3年以上も前なのは少し気になりますが、上のリンク先の画面の下方にOSごとのバイナリのダウンロードリンクがあります。

ここでは、私のFedoraの仮想環境でLinuxバージョンを選択します。

これをダウンロードして、mailhogと改名して/usr/local/binに移します。また、chmodを実行して適切なパーミッションを与えます。

# mv MailHog_linux_386 /usr/local/bin/mailhog
# chmod 755 mailhog

次にコマンドラインで、mailhogを実行します。このリンク先のようなスクリプトを作成して、OSのサービスとして立ち上げてもOKです。

$ mailhog 
2021/01/07 08:42:42 Using in-memory storage
2021/01/07 08:42:42 [SMTP] Binding to address: 0.0.0.0:1025
[HTTP] Binding to address: 0.0.0.0:8025
2021/01/07 08:42:42 Serving under http://0.0.0.0:8025/
Creating API v1 with WebPath: 
Creating API v2 with WebPath:

これでMailhogがメールを受信できる準備ができました。

Laravelの環境変数の設定

Laravelのプロジェクトでは、.envを編集して以下のようにメール送信の設定をします。

...
MAIL_MAILER=smtp
MAIL_HOST=0.0.0.0
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWIRD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@example.com
MAIL_FROM_NAME=test
...

MailTrapのような設定ですが、PortやEncryptが違うことに注意を。

メール送信テスト

準備が整ったところで、tinkerでまずテキストメールを送信

$ php artisan tinker
Psy Shell v0.10.4 (PHP 7.2.24 — cli) by Justin Hileman
>>> Mail::raw('Hello', function($m) { $m->subject('hello')->to('test@example.com'); });
=> null
>>> 

ブラウザを開いて、http://localhost:8025にアクセスすると、以下の画面が表示されます。

メール届いていますね!

メールの中身も閲覧できます。

今度は、アプリからHTMLのメールを送信します。

いいですね。ちゃんと表示されています。

さて、HTMLソースはどうでしょう。

う~ん。Quoted-printableがそのままです。例えば、上の画面の青背景は、「確認」の日本語なのですがこれじゃ読めません。もちろん、メールをファイルとしてダウンロードしてOutlookでHTMLソースを見ることが可能ですが、ちょいと不便です。

ここの部分残念ですが、自分のメールアカウントを使用せずに開発のテストとしては十分と思います。無料であることを考えたら、なおさら。

最後に、先のmailhogのプログラムの実行を停止したら、デフォルトではメモリにメールを保存なので受信したメールはすべて消えてしまいます。それが嫌なら、mongodbにメールを保存するオプションもあります。

By khino