Mail

設定

Laravel 利用一個熱門的函式庫 SwiftMailer 來建立一個乾淨簡單的 API。郵件設定檔為 app/config/mail.php,裏面有些選項,可以讓你更改你的 SMTP 連接埠、憑證以及可以為透過此函式庫寄出的所有信件,設定一個全域的寄件者 from。你可以使用任何的 SMTP 伺服器。如果你想要使用 PHP 內建的 mail 函式來寄送郵件,你可以將設定檔中的 driver 改為 mail 即可。sendmail 的驅動一樣可以使用。

第三方郵件服務 API 驅動

Laravel 也包含了 Mailgun 和 Mandrill 服務的 HTTP API 的驅動方式。這些 API 比使用 SMTP 伺服器更簡單快速。這些驅動都需要在你的應用程式裡預先安裝 Guzzle 4 HTTP 函式庫。你可以透過在你的 composer.json 檔中增加一行如下,來將 Guzzle 4 安裝到你的專案中:

"guzzlehttp/guzzle": "~4.0"

Mailgun 驅動

使用 Mailgun 驅動前,先在 app/config/mail.php 設定檔中將 driver 設定為 mailgun。再來,如果你的專案中沒有 app/config/services.php 請先建立他。並確定它包含了如下的內容:

'mailgun' => array(
    'domain' => 'your-mailgun-domain',
    'secret' => 'your-mailgun-key',
),

Mandrill 驅動

使用 Mandrill 驅動前,先在 app/config/mail.php 設定檔中將 driver 設定為 mandrill。再來,如果你的專案中沒有 app/config/services.php 請先建立他。並確定它包含了如下的內容:

'mandrill' => array(
    'secret' => 'your-mandrill-key',
),

Log 驅動

如果你的 app/config/mail.php 設定檔的 driver 被設定為 log 時,所有的郵件將會被寫進日誌中,且並不會真的被寄出。這主要用在快速本地除錯和內容驗證上。

基本用法

Mail::send 方法是用來寄送電子郵件:

Mail::send('emails.welcome', $data, function($message)
{
    $message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});

send 方法的第一個參數為郵件內容的視圖名稱,第二個參數 $data 為傳遞至視圖的變數,而第三個參數為一個閉包讓你可以指定更多寄送電子郵件的訊息選項。

注意: 變數預設被傳遞進郵件的視圖中,且允許內嵌復健。所以最好避免傳遞名為 message 的變數至你的視圖中造成重疊。

除了使用 HTML 視圖外,你也可以指定一個純文字的視圖:

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

或者你也可以指定視圖類別為 htmltext

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

你也可以為電子郵件訊息指定其他選項如附加檔案或是任何的副本收件者:

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 type 及 / 或一個顯示名稱:

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

注意:Mail::send 的閉包中使用 SwiftMailer 的 message 擴充實例,允許你可以呼叫任何類別中的方法來建立你的電子郵件。

內嵌附件

內嵌圖片到郵件中通常是一件很麻煩的事,然而 Laravel 提供一個便利的方式讓你內嵌圖片到你的電子郵件當中且接收相對應的 CID。

內嵌圖片到電子郵件的視圖中

<body>
    Here is an image:

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

內嵌資料到電子郵件的視圖中

<body>
    Here is an image from raw data:

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

注意 $message 這個變數一定會被 Mail 類別傳遞到電子郵件的視圖當中。

郵件佇列

加入一個郵件到佇列中

寄送電子郵件會大幅的延長你應用程式的反應時間,許多開發者選擇讓電子郵件放進隊列中,並在背景(非即時)寄送。Laravel 使用內建的 unified queue 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!');
});

假如你想要指定一個特別的隊列或管道來發送郵件,你可以使用 queueOnlaterOn 方法:

Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
    $message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});

郵件與本地開發

在開發應用程式的寄信功能時,通常會希望在本地或是開發環境中關閉寄送功能。你可以呼叫 Mail::pretend 方法,或是在 app/config/mail.php 設定檔的 pretendtrue 可以達到。當在 pretend 模式開啟下,郵件將會被寫到你的應用程式日誌中取代實際寄出信件。

開啟「Pretend」寄送模式

Mail::pretend();