網站除了要讓人閱覽,或者輸入資料以外,也常常會需要寄送一些信件。比方說忘記密碼時的通知信,或者訂單成功時的確認信等等。
一般來說,遇到這種需求,會想要開啟一個獨立的 Mail Server,然後透過呼叫 API 的方式,來讓該 Mail Server寄送信件。
不過,如果你不想這麼做,Laravel 也有一套寄信方式,可以透過和 SMTP Server 對接的方式,協助我們撰寫並且寄信件。
今天我們就來看看這部分的作法!
首先,我們來看看寄信服務的設置部分。
如果你是用 Laravel Sail 來開啟服務,那麼恭喜你,Laravel Sail 已經幫你做好一個模擬寄送信件的服務了。
讀者可以打開 http://127.0.0.1:8025/ 看看,如果順利的話,應該可以看到 mailhog 的畫面
設置的部分,在 .env
裡面
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
這邊的 Mailhog 是一個開源的專案,讓我們可以在開發時,能模擬 SMTP 服務,測試信件是否能正常寄送。避免我們在開發階段就不斷送信,導致費用提高的問題。
這次的教學內,筆者會以 Mailhog 作為範例,所以這些信件都只會在 Mailhog 後台中看到,不會實際的寄出。
確認我們的模擬寄信服務存在之後,我們就可以撰寫信件內容了
Laravel 裡面定義信件的方式,是以 Mailable 物件作為定義。
要建立 Mailable 物件,又双叒叕是透過 artisan 協助我們建立
./vendor/bin/sail artisan make:mail OrderShipped
建立好之後,應該會在 app/Mail
資料夾底下看到 OrderShipped.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('view.name');
}
}
看到 $this->view('view.name')
,相信讀者應該感受到作法了:其實就跟我們撰寫網頁類似,寫一個 blade template,Laravel 就會自動幫我們處理好,接著就是寄送信件就可以了。
我們稍微調整一下 build()
的內容
public function build()
{
return $this->from('example@example.com', 'Example')
->subject('訂單成立')
->view('emails.orders.shipped');
}
然後我們在 web.php
裡面建立測試寄件的路由
Route::get('/mail', function () {
Mail::to("flamerecca711@gmail.com")->send(new OrderShipped());
});
接著我們連線 http://127.0.0.1/mail,如果順利的話,應該會看到一片白畫面。
如果看到類似 Target class [mail.manager] does not exist.
的文字,可能是 cache 沒有清乾淨,可以嘗試清理看看
./vendor/bin/sail composer dump-autoload
./vendor/bin/sail artisan config:clear
接著,我們到 mailhog 裡面檢查。連線 http://127.0.0.1:8025/
這樣,我們的寄信功能就模擬完成了!
今天有關信件撰寫的部分,就先到這邊。各位明天見!