laravel 基礎教程 —— 郵件

郵件

簡介

laravel 基于流行的 SwiftMailer 類庫構建了一種干凈簡潔的郵件 API。laravel 提供了驅動以支持 SMTP,Mandrill,SparkPost,Amazon SES,PHP 的 mail 方法和 sendmail 方法,這允許你快速的開始構建通過本地或云服務發(fā)送郵件的功能。

驅動先決條件

基于 API 的驅動程序如 Mailgun 和 Mandrill 通常要比 SMTP 服務簡單快速。所有的 API 驅動都必須引入 Guzzle HTTP 類庫,你可以通過在 composer.json 文件中添加下面的內容來進行安裝:

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

Mailgun 驅動

如果使用 Mailgun 驅動,你首先需要安裝 Guzzle,然后設置 config/mail.php 配置文件的 driver 選項為 mailgun。然后,你需要確認你的 config/services.php 配置文件中包含以下選項:

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

Mandrill 驅動

如果使用 Mandrill 驅動,你首先需要安裝 Guzzle,然后設置 config/mail.php 配置文件的 driver 選項為 mandrill。接著,你需要確認你的 config/services.php 配置文件中包含以下選項:

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

SparkPost 驅動

如果使用 SparkPost 驅動,你首先需要安裝 Guzzle,然后設置你的 config/mail.php 配置文件中的 driver 選項為 sparkpost。接著,你需要確認你的 config/services.php 配置文件中包含以下選項:

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

SES 驅動

如果使用 Amazon SES 驅動,你需要在 PHP 中引入 Amazon AWS SDK。你可以通過在 composer.json 文件中進行引入安裝:

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

然后設置你的 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
],

發(fā)送郵件

laravel 允許你使用視圖來存儲你的郵件信息。比如,你可以在 resources/views 目錄下創(chuàng)建一個 emails 目錄來管理你的郵件視圖:

你需要使用 Mail 假面的 send 方法來發(fā)送一個郵件。send 方法接收三個參數(shù),第一個參數(shù)應該是視圖的名稱。第二個參數(shù)應該是傳遞到視圖中的數(shù)據(jù)所組成的數(shù)組。最后,是一個 Closure 回調函數(shù),這個回調函數(shù)會接收一個 message 實例,這允許你自由的配置收件人,主題,和其他方面的郵件信息:

<?php

namespace App\Http\Controller;

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

class UserController extends Controller
{
  /**
   * Send an e-mail reminder to the user.
   *
   * @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->from('hello@app.com', 'Your Application');

       $m->to($user->email, $user->name)->subject('Your Reminder!');
     });
   }
}

因為上面的示例中我們傳遞了 user 鍵到數(shù)組中,所以我們可以在我們的郵件視圖中使用用戶的名稱:

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

注意: 一個 $message 變量會自動的傳遞到郵件視圖,并且允許內聯(lián)附件。所以,你應該避免手動的傳遞到視圖 message 變量。

構建一個 Message

就如我們上面談到的,傳遞到 send 方法的第三個參數(shù)是一個 Closure,這個閉包允許你設置郵件信息的各種選項。使用閉包,你可以指定信息的其它屬性,比如復寫,密抄等:

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

  $message->to('foo@example.com')->cc('bar@example.com');
});

這里列出了 $message 構建實例所有可用的方法:

$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 = []);

// Attach a file from a raw $data string...
$message->attachData($data, $name, array $options = []);

// Get the underlying SwiftMailer message instance...
$message->getSwiftMessage();

注意:message 實例繼承自 SwiftMailer 信息類并會被傳遞到 Mail::send 閉包中。這允許你在訪問所有 SwiftMailer 信息類的方法。

純文本郵件

默認的,send 方法會假設傳遞到其中的視圖包含了 HTML。但是,你可以傳遞一個數(shù)組到 send 方法的第一個參數(shù),你指定一個純文本視圖來合并 HTML 視圖:

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

或者你可以只傳遞一個純文本的郵件,你需要指定數(shù)組的鍵為 text:

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

原始字符串郵件

你可以使用 raw 方法來直接發(fā)送原始字符串郵件:

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

附件

你可以使用傳遞到閉包中的 $message 對象的 attach 方法來在郵件中添加附件。attach 方法接收一個完整的文件路徑作為第一個參數(shù):

Mail::send('emails.welcome', $data, function ($message) {
  //

  $message->attach($pathToFile); 
});

當你添加一個郵件附件時,你可能也需要指定附件顯示的名稱或者 MIME type。你可以向 attach 方法傳遞一個數(shù)組作為第二個參數(shù):

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

attachData 方法可以用來添加一個原始字節(jié)字符串作為一個附件。比如,你可能需要使用這個方法來將內存中生成的 PDF 直接添加到附件中,而不需要先存儲到磁盤:

$message->attachData($pdf, 'invoice.pdf');

$message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]);

內聯(lián)附件

在郵件視圖中嵌入一個圖片

在郵件中內聯(lián)一個圖片通常是比較笨重的。但是,laravel 提供了一種便捷的方式在你的郵件中附加一個圖片并且取回適當?shù)?CID。你需要在郵件視圖中使用 $message 變量的 embed 方法。你應該記得,Laravel 會自動的創(chuàng)建一個 $message 變量并將其傳遞到你的郵件視圖中:

<body>
  Here is an image:

  <img src="<?php echo $message->embed($pathToFile); ?>"
</body>

嵌入原始數(shù)據(jù)到視圖

如果你希望嵌入一個原始數(shù)據(jù)到郵件信息中,你可以使用 $message 變量的 embedData 方法:

<body>
  Here is an image from raw data:

  <img src="<?php echo $message->embedData($data, $name); ?>"
</body>

郵件隊列

隊列化郵件信息

由于發(fā)送郵件是非常消耗資源的一件事,這樣會影響到應用的響應時間。所以很多開發(fā)者都選擇使用隊列來完成異步的郵件發(fā)送。Laravel 使用統(tǒng)一的隊列接口來使這些非常簡單。你需要使用 Mail 假面的 queue 方法來使郵件隊列化:

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

該方法會自動的在隊列添加發(fā)送郵件的任務,該任務會在后臺自動的執(zhí)行。當然,你需要先配置好隊列。

延遲消息隊列

如果你希望延遲執(zhí)行郵件的發(fā)送隊列。你需要使用 later 方法。你需要在方法的第一個參數(shù)傳送一個你希望延遲執(zhí)行的秒數(shù):

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

添加到指定的隊列

如果你希望添加郵件任務到指定的隊列,你需要使用 queueOnlaterOn 方法:

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

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

郵件 & 本地開發(fā)

當開發(fā)一個發(fā)送郵件的服務時,你可能并不希望真實的去發(fā)送一個郵件。只需要模擬測試成功就可以了。laravel 提供了多種方式來禁用真實的郵件發(fā)送。

log 驅動

其中一個解決方案就是在本地開發(fā)時使用 log 郵件驅動。這個驅動會將所有的郵件信息寫入到日志文件中。

通用的郵件

另外一個解決方案就是設置一個通用的郵件來接收所有的應用發(fā)出的郵件。這種方式,會使應用生成的所有郵件都發(fā)送到這個地址。你可以通過配置 config/mail.php 文件的 to 選項來進行設置:

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

mailtrap

最后,你也可以使用一些像 Mailtrapsmtp 驅動的服務來發(fā)送你的郵件到一個虛擬郵箱,而且你也可以通過真實的郵件客戶端進行查看。這可以使你看到真實的郵件在 Mailtrap 中的顯示效果。

事件

laravel 會在發(fā)送郵件之前觸發(fā)事件。你應該注意的是,它是在郵件發(fā)送之前觸發(fā)事件,而不是添加到隊列時。你可以在 EventServiceProvider 中注冊一個事件監(jiān)聽者:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
 protected $listen = [
  'Illuminate\Mail\Events\MessageSending' => [
    'App\Listeners\LogSentMessage',
  ],
 ];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容