2017年4月19日 星期三

MailCatcher -- 寄 mail 的測試

參考網址 https://mailcatcher.me/

在開發程式時,測試 mail 的功能是一大困擾,常常一不小心,就寄出一堆垃圾信。我自己也有過這種不光采的經驗,事後還要寫 mail 和使用者道歉。

其實,別人也會有這種困擾,某天心血來潮,用 fake smtp server 搜尋一下,找到一堆 solution,其中一個是 mailmatcher,看起來還算方便。

安裝

安裝方式很簡單,直接下指令即可,gem install mailcatcher。當然,要先安裝 ruby 的 gem 才可以。
另外,最好先安裝 sqlite3,不然在用 gem 安裝 mailcatcher 時會失敗。

執行及設定

直接 mailcatcher 即可啟動 daemon,不過,這樣在遠端無法瀏覽。帶上 ip 的參數,即mailcatcher --ip=0.0.0.0,這樣在遠端透過 http://10.161.86.38:1080/ 即可看到測試的情形。

關於 PHP 的設定,執行 which catchmail ,確定指令所在位置,然後將 path 複制到 php.ini 中的 sendmail_path,即   
sendmail_path = "/usr/bin/env /usr/local/bin/catchmail "

修改 Laravel 的 .env 如下
# mailcatcher
MAIL_DRIVER=smtp
MAIL_HOST=10.161.86.38
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

測試程式

在 routes.php 中,建立下列的 route 指令,然後瀏覽 http://10.161.86.38/mail_tst 即可看到結果。
Route::any('mail_tst', function() { 
    $user = ['email' => 'agee@gmail.com', 'name' => 'agee'];
     Mail::send('emails.reminder', ['user' => $user], 
                function ($m) use ($user) 
    {
       $m->from('hello@app.com', 'Your Application');
       $m->to($user['email'], $user['name'])->subject('Your Reminder!');
     }); 
    return 'Mail test';
});

或者純粹 PHP 程式的測試,如下
$Mheader = "From: ajax@nctu.edu.tw\nContent-Type: text/plain; charset=big5\nContent-Transfer-Encoding: 8bit";
$Mtitle = 'mail test 123';
$Memail = 'ajax@nctu.edu.tw';
$Mcontent = " If you have any questions or concerns, please email the support group at ntuceiba@ntu.edu.tw\n\n";
$flg = mail($Memail,$Mtitle,$Mcontent,$Mheader);

if ($flg) {
    echo "mail ok!";
} else {
    echo "mail failed!";
}

CentOS 的設定

CentOS 下,必須要安裝
yum install sqlite-devel openssl-devel autoconf bison automake libtool gcc-c++
yum install rubygems ruby-devel

Systemd Service / Daemon
mailcatcher.service
# mailcatcher
[Unit]
Description=MailCatcher Service
After=network.service vagrant.mount

[Service]
Type=simple
ExecStart=/usr/local/bin/mailcatcher --foreground --ip 0.0.0.0

[Install]
WantedBy=multi-user.target

沒有留言: