郵件
設置
Laravel 提供一個乾淨且簡單的郵件 API,建構於熱門的 SwiftMailer 函式庫,郵件設定檔案放在 app/config/mail.php
,允許你變更你的 SMTP 主機位置、Port 及驗證方式,也可以設定全部郵件的 寄件人 (from)
地址,你可以使用任何的 SMTP 伺服器,如果你希望使用 PHP 內建的 mail
函式發送郵件,只要在設定檔中將 driver
參數設定為 mail
即可,且 Laravel 也支援透過 sendmail 郵件伺服器寄送郵件。
基本使用
使用 Mail::send
方法發送郵件:
Mail::send('emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
傳送給 send
方法的第一個參數是郵件內容的視圖 (View) 名稱,第二個參數是傳送給視圖處理的 資料
,第三個閉合函式可以讓你設定郵件寄送的選項。
注意: 預設都會傳送
$message
變數資訊給郵件視圖,讓你可以在視圖中嵌入附件,所以最好避免將傳送到視圖的資料變數名稱設為message
你也可以指定一個純文字視圖,並將其附加在 HTML 視圖上:
Mail::send(array('html.view', 'text.view'), $data, $callback);
或許你也可以透過 html
或 text
關鍵字,指定使用單一類型郵件視圖:
Mail::send(array('text' => 'view'), $data, $callback);
你也可以設定郵件的其他選項,像是副本 (CC:carbon copies) 或是附加檔案:
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);
});
當你附加檔案到郵件時,你也可以指定檔案的 "MIME 類型"或是"檔案顯示名稱":
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
注意: 傳送到
Mail::send
閉合函式的 message 實例繼承了 SwiftMailer 類別,所以你可以呼叫在 SwiftMailer 類別中的任何方法去建立你的郵件。
內嵌附件
在郵件中嵌入圖片通常都很麻煩,然而 Laravel 提供了很簡單的方法去附加圖片到郵件中,並可取得相對應的 CID。
嵌入圖片到郵件視圖中
<body>
這裡有一張圖片:
<img src="<?php echo $message->embed($pathToFile); ?>">
</body>
嵌入原始資料到郵件視圖中
<body>
這裡有從原始資料來的圖片:
<img src="<?php echo $message->embedData($data, $name); ?>">
</body>
這裡需注意到, Mail
類別預設都會傳送 $message
變數資料到郵件視圖中。
佇列郵件
由於發送郵件會讓你的應用程式花費很長的時間去等待處理的回應,許多開發者選擇將郵件 佇列 (queue) 起來,並在背景執行發送動作, Laravel 建立了統一的 佇列 API,讓佇列郵件可以很容易的實作,只要在 Mail
類別使用 queue
方法就可以佇列郵件:
佇列郵件
Mail::queue('emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
你也可以使用 later
方法,去指定要經過幾秒的延遲後再發送郵件:
Mail::later(5, 'emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
如果你想要將郵件放到指定的 "佇列 (queue)" 或 "管道 (tube)" ,可以使用 queueOn
及 laterOn
方法:
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
郵件與本地開發
當你開發郵件寄送的應用時,你通常會想要在 "本地" 或 "開發環境" 中關閉傳送郵件功能,為了達到這樣的目的,你可以呼叫 Mail::pretend
方法,或者在郵件設定檔 app/config/mail.php
設定 pretend
的選項為 true
,當你的郵件設定在 pretend
模式時,郵件訊息將會寫到你應用程式的 log 檔案中,而不會發送給使用者。
開啟郵件 Pretend 模式
Mail::pretend();