回到最上方

文件

郵件

設置

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);

或許你也可以透過 htmltext 關鍵字,指定使用單一類型郵件視圖:

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)" ,可以使用 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 設定 pretend 的選項為 true,當你的郵件設定在 pretend 模式時,郵件訊息將會寫到你應用程式的 log 檔案中,而不會發送給使用者。

開啟郵件 Pretend 模式

Mail::pretend();

討論