鍍金池/ 教程/ PHP/ 郵件
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊列
調(diào)整器
分頁
文件系統(tǒng)/云存儲
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認(rèn)證
Artisan 控制臺
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯誤&日志

郵件

1、簡介

Laravel 基于目前流行的 SwiftMailer 庫提供了一套干凈清爽的郵件 API。Laravel 為 SMTP、Mailgun、Mandrill、Amazon SES、PHP 的 mail 函數(shù),以及 sendmail 提供了驅(qū)動,從而允許你快速通過本地或云服務(wù)發(fā)送郵件。

1.1 郵件驅(qū)動預(yù)備知識

基于驅(qū)動的 API 如 Mailgun 和 Mandrill 通常比 SMTP 服務(wù)器更簡單、更快。所有的 API 驅(qū)動要求應(yīng)用已經(jīng)安裝 Guzzle HTTP 庫。你可以通過添加如下行到 composer.json 文件來安裝 Guzzle 到項目:

"guzzlehttp/guzzle": "~5.3|~6.0"

1.1.1 Mailgun 驅(qū)動

要使用 Mailgun 驅(qū)動,首先安裝 Guzzle,然后在配置文件 config/mail.php 中設(shè)置 driver 選項為 mailgun。接下來,驗證配置文件 config/services.php 包含如下選項:

'mailgun' => [
    'domain' => 'your-mailgun-domain',
    'secret' => 'your-mailgun-key',],

1.1.2 Mandrill 驅(qū)動

要使用 Mandrill 驅(qū)動,首先安裝 Guzzle,然后在配置文件 config/mail.php 中設(shè)置 driver 選項值為 mandrill。接下來,驗證配置文件 config/services.php 包含如下選項:

'mandrill' => [
    'secret' => 'your-mandrill-key',],

1.1.3 SES 驅(qū)動

要使用 Amazon SES 驅(qū)動,安裝 Amazon AWS 的 PHP SDK,你可以通過添加如下行到 composer.json 文件的require 部分來安裝該庫:

"aws/aws-sdk-php": "~3.0"

接下來,設(shè)置配置文件 config/mail.php 中的 driver 選項為ses。然后,驗證配置文件 config/services.php 包含如下選項:

'ses' => [
    'key' => 'your-ses-key',
    'secret' => 'your-ses-secret',
    'region' => 'ses-region',  // e.g. us-east-1
],

2、發(fā)送郵件

Laravel 允許你在視圖中存儲郵件信息,例如,要組織你的電子郵件,可以在 resources/views 目錄下創(chuàng)建 emails 目錄。

要發(fā)送一條信息,使用Mail 門面上的 send方法。send方法接收三個參數(shù)。第一個參數(shù)是包含郵件信息的視圖名稱;第二個參數(shù)是你想要傳遞到該視圖的數(shù)組數(shù)據(jù);第三個參數(shù)是接收消息實例的閉包回調(diào)——允許你自定義收件人、主題以及郵件其他方面的信息:

<?php

namespace App\Http\Controllers;

use Mail;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller{
    /**
     * 發(fā)送郵件給用戶
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function sendEmailReminder(Request $request, $id)
    {
        $user = User::findOrFail($id);

        Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
            $m->to($user->email, $user->name)->subject('Your Reminder!');
        });
    }
}

由于我們在上例中傳遞一個包含 user 鍵的數(shù)組,我們可以在郵件中使用如下方式顯示用戶名:

<?php echo $user->name; ?>

注意:$message 變量總是被傳遞到郵件視圖,并允許嵌入附件,因此,你應(yīng)該在視圖負(fù)載中避免傳入消息變量。

構(gòu)造消息 正如前面所討論的,傳遞給 send方法的第三個參數(shù)是一個允許你指定郵件消息本身多個選項的閉包。使用這個閉包可以指定消息的其他屬性,例如抄送、群發(fā),等等:

Mail::send('emails.welcome', $data, function ($message) {
    $message->from('us@example.com', 'Laravel');
    $message->to('foo@example.com')->cc('bar@example.com');
});

下面試$message 消息構(gòu)建器實例上的可用方法:

$message->from($address, $name = null);
$message->sender($address, $name = null);
$message->to($address, $name = null);
$message->cc($address, $name = null);
$message->bcc($address, $name = null);
$message->replyTo($address, $name = null);
$message->subject($subject);
$message->priority($level);
$message->attach($pathToFile, array $options = []);
// 從$data 字符串追加文件...
$message->attachData($data, $name, array $options = []);
// 獲取底層SwiftMailer消息實例...
$message->getSwiftMessage();

注意:傳遞給 Mail::send閉包的消息實例繼承自 SwiftMailer 消息類,該實例允許你調(diào)用該類上的任何方法來構(gòu)建自己的電子郵件消息。

純文本郵件 默認(rèn)情況下,傳遞給 send方法的視圖假定包含 HTML,然而,通過傳遞數(shù)組作為第一個參數(shù)到send 方法,你可以指定發(fā)送除 HTML 視圖之外的純文本視圖:

Mail::send(['html.view', 'text.view'], $data, $callback);

或者,如果你只需要發(fā)送純文本郵件,可以指定在數(shù)組中使用 text 鍵:

Mail::send(['text' => 'view'], $data, $callback);

原生字符串郵件 如果你想要直接發(fā)送原生字符串郵件你可以使用raw 方法:

Mail::raw('Text to e-mail', function ($message) {
    //
});

2.1 附件

要添加附件到郵件,使用傳遞給閉包的$message 對象上的 attach 方法。該方法接收文件的絕對路徑作為第一個參數(shù):

Mail::send('emails.welcome', $data, function ($message) {
    //
    $message->attach($pathToFile);
});

當(dāng)添加文件到消息時,你還可以通過傳遞數(shù)組作為第二個參數(shù)到 attach 方法來指定文件顯示名和 MIME 類型:

$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);

2.2 內(nèi)聯(lián)附件

2.2.1 在郵件視圖中嵌入一張圖片

嵌套內(nèi)聯(lián)圖片到郵件中通常是很笨重的,然而,Laravel 提供了一個便捷的方式附加圖片到郵件并獲取相應(yīng)的 CID,要嵌入內(nèi)聯(lián)圖片,在郵件視圖中使用$message 變量上的embed方法。記住,Laravel 自動在所有郵件視圖中傳入$message 變量使其有效:

<body>
    Here is an image:
    <img src="<?php echo $message->embed($pathToFile); ?>">
</body>

2.2.2 在郵件視圖中嵌入原生數(shù)據(jù)

如果你想要在郵件消息中嵌入原生數(shù)據(jù)字符串,可以使用$message 變量上的 embedData 方法:

<body>
    Here is an image from raw data:
    <img src="<?php echo $message->embedData($data, $name); ?>">
</body>

2.3 郵件隊列

2.3.1 郵件消息隊列

發(fā)送郵件消息可能會大幅度延長應(yīng)用的響應(yīng)時間,許多開發(fā)者選擇將郵件發(fā)送放到隊列中再后臺執(zhí)行,Laravel 中可以使用內(nèi)置的統(tǒng)一隊列 API 來實現(xiàn)。要將郵件消息放到隊列中,使用 Mail 門面上的 queue 方法:

Mail::queue('emails.welcome', $data, function ($message) {
    //
});

該方法自動將郵件任務(wù)推送到隊列中以便在后臺發(fā)送。當(dāng)然,你需要在使用該特性前配置隊列。

2.3.2 延遲消息隊列

如果你想要延遲已經(jīng)放到隊列中郵件的發(fā)送,可以使用later 方法。只需要傳遞你想要延遲發(fā)送的秒數(shù)作為第一個參數(shù)到該方法即可:

Mail::later(5, 'emails.welcome', $data, function ($message) {
    //
});

2.3.3 推入指定隊列

如果你想要將郵件消息推送到指定隊列,可以使用 queueOnlaterOn 方法:

Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) {
    //
});

Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) {
    //
});

3、郵件&本地開發(fā)

開發(fā)發(fā)送郵件的應(yīng)用時,你可能不想要真的發(fā)送郵件到有效的電子郵件地址,而只是想要做下測試。Laravel 提供了幾種方式“禁止”郵件的實際發(fā)送。

3.1 日志驅(qū)動

一種解決方案是在本地開發(fā)時使用 log 郵件驅(qū)動。該驅(qū)動將所有郵件信息寫到日志文件中以備查看,想要了解更多關(guān)于每個環(huán)境的應(yīng)用配置信息,查看配置文檔。

3.2 通用配置

Laravel 提供的另一種解決方案是為框架發(fā)送的所有郵件設(shè)置通用收件人,這樣的話,所有應(yīng)用生成的郵件將會被發(fā)送到指定地址,而不是實際發(fā)送郵件指定的地址。這可以通過在配置文件config/mail.php中設(shè)置 to 選項來實現(xiàn):

'to' => [
    'address' => 'dev@domain.com',
    'name' => 'Dev Example'
],

3.3 Mailtrap

最后,你可以使用 Mailtrap 服務(wù)和smtp 驅(qū)動發(fā)送郵件信息到“虛擬”郵箱,這種方法允許你在 Mailtrap 的消息查看器中查看最終的郵件。