在開發程式時,測試 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 |
沒有留言:
張貼留言