在 Laravel 上用 MailCatcher 發送測試信件

雖然 Laravel 在寄送測試信件上提供了 Mailgun 這個服務的串接方式,不過如果能夠在 Homestead 就可以直接測試是更棒的選擇;而 MailCatcher 剛好就提供這樣的功能,它能啟動一個 SMTP 模擬服務,並且讓我們透過 Web 介面來查看信件是否有被發送出來。

註:類似的工類還有用 Go 寫的 MailHog ,據說速度更快;雖然我還沒試過,但我想用法應該是相同的。

以下就簡單介紹一下如何在 Laravel 5.1 上使用 MailCatcher 。

安裝 MailCatcher

這裡我們用 Homestead 示範,先把 Homestead 的 port 1080/1025 導到本機的 port 1080/1025 ,方便稍後在本機操作。執行:

$ homestead edit

註: $ 為提示字元,不需要輸入。

然後加入:

ports:
    - send: 1080
      to: 1080
    - send: 1025
      to: 1025

接著進入 Homestead :

$ homestead up
$ homestead ssh

確認 Ruby 環境是安裝好的:

$ ruby -v
ruby 2.1.2p95 (2014-05-08) [x86_64-linux-gnu]

$ gem -v
2.2.2

然後安裝 MailCatcher :

$ sudo gem install mailcatcher --no-ri --no-rdoc

安裝完成後,直接執行 mailcatcher

$ mailcatcher --ip 0.0.0.0
Starting MailCatcher
==> smtp://0.0.0.0:1025
==> http://0.0.0.0:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.

這樣 MailCatcher 的 port 1025 就會監聽 SMTP 請求,而 port 1080 就會是它的 Web 管理介面。

打開本機的瀏覽器,瀏覽 http://127.0.0.1:1080 ,應該就會看到 MailCatcher 的 Web 管理介面:

MailCatcher Web UI

修改 Laravel Mail 設定

這裡我假設你已經建立一個 Laravel 5.1 專案了,所以修改 .env 中的 MAIL_HOSTMAIL_PORT 即可:

MAIL_HOST=127.0.0.1
MAIL_PORT=1025

其他一切都可以不需要改動。

測試發送信件

我們可以直接用 tinker 來測試是否能夠發送信件,執行:

$ php artisan tinker
Psy Shell v0.5.2 (PHP 5.6.8 — cli) by Justin Hileman
>>>

然後輸入:

Mail::raw('This is a test mail', function ($message) {
$message->subject('Test');
$message->from('laravel@example.com', 'Laravel');
$message->to('user@example.com');
});

結果應該會回傳 1 ,然後你可以回到瀏覽器查看 MailCatcher 是否有收到這封信,結果應該會如下圖所示:

MailCatcher Result

與其他測試框架的整合

MailCatcher 可以跟 PHP 的自動化測試框架做很好的整合,詳情可以參考以下文章: