這個章節要介紹的是郵件,其實郵件不是想像中很難,只要你有 mail伺服器,基本上很快就能使用,因為Laravel 提供的設定其實蠻完整的。

接下來我會以我的Google 的 Gmail信箱作為我的郵件伺服。

郵件

Laravel 以 SwiftMailer 為核心,開發了一套郵件系統的 API 程式庫,支援以下的郵件服務。

  • Mailgun
  • Mandrill
  • SparkPost
  • Amazon SES
  • SMTP
  • PHP Mail
  • Sendmail
  • Postmark

若使用雲端寄信服務的, Laravel 專案 > config 裡的 services.phpmail.php,已經建立好部分的鍵值。其他的如果需要使用,就可能需要各自建立services.php 裡面。

雲端 API 驅動程式所需要的

在使用 MailgunSparkPostPostmark 這些的郵件服務前,都需要在應用程式中安裝 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'
];

// 在 View 顯示寄件人資訊
$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;">
&nbsp;
<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');

執行專案

1
$ php artisan serve

http://127.0.0.1:8000/

頁面執行

到信箱收信,成功收信。

信件內容

前面開頭就會有在 Controller 寫的 $to_info 陣列資料帶出來的 name

結論

下一篇會使用 mailable 語法來發信,在 Laravel 5.3 以後的專案在市場上應該算是廣泛使用了。

題外話,其實身邊有很多朋友都想寫程式,可是怕沒時間、怕學不來、怕沒人問,其實這些都不是問題,重點是肯不肯把休息時間拿來運用了,人人都可學程式,沒有學不來的。

標籤: w3HexSchool PHP Laravel