php – Laravel – 透過 Gmail 發送 E-mail 信件
.env 設定檔
關於使用 Gmail 的設定,可以注意這篇我提到的:在 PHP 中使用 Gmail SMTP 無法驗證的方法。透過這篇步驟,我們理當能取得下方 SMTP 的各個資訊包含密碼,我們填入吧!
1 2 3 4 5 6 7 8 9 10 |
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=帳號 MAIL_PASSWORD=密碼 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=fdjkgh580@gmail.com MAIL_FROM_NAME=fdjkgh580 |
要使用全域的 “from” (寄件者地址) 或 “reply_to” (回覆的地址),在 config/mail.php 中能發現是透過 .env 來寫入我們的 mail 設定檔,例如
1 2 3 4 5 6 7 8 |
'driver' => env('MAIL_DRIVER', 'smtp'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), ...... |
Mailables
準備一個”能夠發送郵件” (Mailables) 的類別,例如產生 app\Mail\Warning.php
1 2 3 |
php artisan make:mail Warning |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class Warning extends Mailable { use Queueable, SerializesModels; public $params; // 讓外部可以將參數指定進來 public function __construct($params) { $this->params = $params; } public function build() { // 透過 with 把參數指定給 view return $this->subject("警告訊息") ->view('emails.warning') ->with([ 'params' => $this->params, ]); } } |
View
而信件內容模板的變數 $params 我們會由 Controller 傳入。我們建立 /views/emails/warning.blade.php
1 2 3 4 5 |
<p> {{ $params['say'] }} </p> |
Router
routes/web.php
1 2 3 |
Route::get('/warning', 'WarningController@send'); |
Controller 寄出郵件
1 2 3 |
php artisan make:controller WarningController |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 記得使用 use use Illuminate\Support\Facades\Mail; use App\Mail\Warning; class WarningController extends Controller { public function send() { // 收件者務必使用 collect 指定二維陣列,每個項目務必包含 "name", "email" $to = collect([ ['name' => 'Jason', 'email' => 'fdjkgh580@gmail.com'] ]); // 提供給模板的參數 $params = [ 'say' => '您好,這是一段測試訊息的內容' ]; // 若要直接檢視模板 // echo (new Warning($data))->render();die; Mail::to($to)->send(new Warning($params)); } } |
這樣就能成功透過 Gmail 發送郵件囉!附帶要提的是,以上這種方法是 Laravel 比較後期的官方建議寫法,不然依照我們過去經驗例如使用過 PHPMailer ,我們可能會寫在一起,例如
1 2 3 4 5 6 7 8 9 10 |
Mail::send('emails.welcome', $data, function($message) { $message->from('us@example.com', 'Laravel'); $message->to('foo@example.com')->cc('bar@example.com'); $message->attach($pathToFile); }); |
雖然也可以送信,不過透過 “Mailable” 的方式,可以把整個網站的發送指派行為,全部集中在路徑app\Mail 底下;剩下在控制器中的行為也只有「用哪個 Mailable 寄給誰」。
好處就是方便維護。當我們的發送郵件行為一旦增量,例如有些要發送註冊通知信、修改密碼信、訂單成立、到貨通知、系統錯誤通知、等等非常多,要維護也只需要查看路徑 app\Mail 底下的 “Mailable” 就能很快知道有那些送件行為,省去到各個 Controller, Services, Libraries 查找的時間。