這個章節要介紹的是郵件,其實郵件不是想像中很難,只要你有 mail伺服器,基本上很快就能使用,因為Laravel 提供的設定其實蠻完整的。
接下來我會以我的Google 的 Gmail信箱作為我的郵件伺服。
郵件
Laravel 以 SwiftMailer 為核心,開發了一套郵件系統的 API 程式庫,支援以下的郵件服務。
- Mailgun
- Mandrill
- SparkPost
- Amazon SES
- SMTP
- PHP Mail
- Sendmail
- Postmark
若使用雲端寄信服務的, Laravel 專案 > config
裡的 services.php
及 mail.php
,已經建立好部分的鍵值。其他的如果需要使用,就可能需要各自建立services.php
裡面。
雲端 API 驅動程式所需要的
在使用 Mailgun
、SparkPost
、Postmark
這些的郵件服務前,都需要在應用程式中安裝 Guzzle HTTP 函式庫。
1
| $ composer require guzzlehttp/guzzle
|
:::info
Guzzle是一個PHP HTTP客戶端,可以輕鬆發送HTTP請求,並且可以輕鬆集成Web服務。
:::
使用 SES
驅動程式就需要安裝 Amazon SES 的函式庫。
1
| $ composer require aws/aws-sdk-php:~3.0
|
設定Gmail郵件服務
STEP 1:點選「管理你的Google帳戶」
STEP 2:左邊點選 「安全性」-> 登入Google 中 點選 「兩步驗證碼」,接著就按照步驟登入設定第一步驟。
STEP 3:第二步驟點選 「Authenticator 應用程式」 -> 「設定」
STEP 4:選擇自己的手機是屬於哪一種
STEP 5:會產生一個QRCODE
Step 6:開啟手機,下載「Google Authenticator」 APP。
STEP 7:開啟「Google Authenticator」 APP
STEP 8:點選 「+」→ 掃描條碼(掃描STEP5的條碼)
STEP 9:裡面就出現二段驗證碼。(防止未來有人盜用)。
STEP 10:APP顯示的驗證碼輸入到網頁上
STEP 11:回到上方就會看到第二個步驟完成設定
STEP 12:回到「安全性」→ 登入Google 中 點選應用程式密碼
STEP 13:登入後 選擇應用程式「郵件」,裝置「自訂」→「Laravel 專案」→ 產生
STEP 14:會產生一組應用程式的密碼,這組應用程式密碼,要用在Laravel Email的Password的。
Laravel 提供的郵件語法
Laravel 提供兩種寄信的語法,第一種是原始的郵寄方式,第二種為 mailable
。
第一種:原始的郵寄方式
接下來以大概這樣的流程去做範例。
以下為語法的內容及方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Mail::send('Html.view', $data, function ($message) use ($to_info){ $message->from('john@johndoe.com', 'John Doe'); $message->sender('john@johndoe.com', 'John Doe'); $message->to('john@johndoe.com', 'John Doe'); $message->cc('john@johndoe.com', 'John Doe'); $message->bcc('john@johndoe.com', 'John Doe'); $message->replyTo('john@johndoe.com', 'John Doe'); $message->subject('Subject'); $message->priority(3); $message->attach('pathToFile'); });
|
Mail::send()
※ 第一個參數: 信件內容的 View 名稱。
※ 第二個參數: 將需要的資料陣列傳給信件內容。(例如:收件人名字)
※ 第三個參數: 為匿名函數(closure),定義寄信需要的資料。(例如寄件人、收件人等)
實作練習
設定郵件服務,使用SMTP服務,設定Gmail Host等設定。
專案 > .env
1 2 3 4 5 6
| MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=xxxxxx@gmail.com MAIL_PASSWORD=xxxxxxxxxx MAIL_ENCRYPTION=tls
|
建立一個 Controller
,這邊要寫一個郵件服務的程式。
1
| $ php artisan make:controller MailController
|
修改前
專案 > app > Http > Controllers > MailController.php
1 2 3 4 5 6 7 8 9 10
| <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class MailController extends Controller { }
|
1、引入 Mail 的類別。
2、寫一個方法Send,裡面是寫有關寄件相關資訊,使用 Mail 類別中的 send 方法設定郵件資訊。
修改後
專案 > app > Http > Controllers > MailController.php
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 32 33
| <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail;
class MailController extends Controller { public function Send(){ $to_info = [ 'name' => 'Black', 'email' => 'ya005845@hotmail.com' ];
$data = [ 'name' => 'Small Black' ];
Mail::send('email.EDM', $data, function ($message) use ($to_info) { $message->from(env('MAIL_USERNAME'),'Sian'); $message->to($to_info['email'],$to_info['name']); $message->subject('第一屆研討會邀請函'); }); return '發送成功'; } }
|
大概設計一個跟上面一樣的 View,這頁面主要是用在寄出郵件的內容。
中間有一段 <p>親愛的工程師您好:</p>
, 這個 $name
是從 $data
的陣列資料帶進來的。
專案 > resources > views > email > EDM.blade.php
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| <!DOCTYPE html> <html lang="zh-Hant-TW"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>第一屆研討會</title> <style type="text/css"> * { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; }
html, body { margin: 0 auto !important; padding: 0 !important; height: 100% !important; width: 100% !important; }
div[style*="margin: 16px 0"] { margin: 0 !important; }
table, td { mso-table-lspace: 0pt !important; mso-table-rspace: 0pt !important; }
table { border-spacing: 0 !important; border-collapse: collapse !important; table-layout: fixed !important; margin: 0 auto !important; }
*[x-apple-data-detectors] { color: inherit !important; text-decoration: none !important; }
@media only screen and (min-device-width: 375px) and (max-device-width: 413px) { .email-container { min-width: 375px !important; } } </style> </head> <body bgcolor="#f3d1d1" style="margin: 0px;"> <center style="width: 100%;"> <div class="email-container" style="max-width: 600px; margin: auto;"> <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="max-width: 600px; bgcolor=" width="100%"> <tbody> <tr bgcolor="#FFFFFF"> <td style="padding: 20px; font-family: sans-serif; font-size: 16px; line-height: 24px; color: #4F4F4F;"> <h1 style=" text-align: center; letter-spacing:1px; line-height: 40px; color:#000000;">2020 Laravel 寄信服務研討會</h1> <p>親愛的{{ $name }}工程師您好:</p> <br> <br> 您知道嗎?一年一度的 Laravel 研討會即將舉行,只要您願意分享,我們都很歡迎!</p> <blockquote style=" color:#990000; font-weight:bold;"> 「在台灣使用PHP開發網頁的企業愈來愈多,但往往專案是如此龐大,各企業也就慢慢導入框架作為輔助,但 Laravel 已漸漸成為市場的主流,因此無私地分享,才可以讓台灣市場更加的進步。」 <p style="text-align: right;">- PHP工程師 Sian</p> </blockquote> </td> </tr> </tbody> </table> </div> </center> </body> </html>
|
將 URL 指向 MailController
專案 > routes > web.php
1 2 3 4 5
| <?php
use Illuminate\Support\Facades\Route;
Route::get('/','MailController@Send');
|
執行專案
http://127.0.0.1:8000/
頁面執行
到信箱收信,成功收信。
信件內容
前面開頭就會有在 Controller
寫的 $to_info
陣列資料帶出來的 name
結論
下一篇會使用 mailable
語法來發信,在 Laravel 5.3 以後的專案在市場上應該算是廣泛使用了。
題外話,其實身邊有很多朋友都想寫程式,可是怕沒時間、怕學不來、怕沒人問,其實這些都不是問題,重點是肯不肯把休息時間拿來運用了,人人都可學程式,沒有學不來的。
標籤: w3HexSchool
PHP
Laravel