Laravel 4 使用 Gmail SMTP 寄送郵件

在本地端開發郵件寄送程式的時候,如果沒有 SMTP 伺服器時,可以先用 Gmail 的外寄郵件(SMTP)伺服器,來進行郵件的寄送。Laravel 4 使用 Swift Mailer 套件處理發送作業,如果需要更進階的郵件寄送規則,可以參考官方 API 文件,自行進行程式的擴充。

環境確認

openssl_enabled.png
因為是透過安全連線請求發送郵件,所以必需確認 PHP 的 openssl 是否已經啟用。可以從 phpinfo 得到相關訊息如下圖,如果沒有出現就表示沒有正確啟用,請修改 php.ini 進行啟用,若仍然有問題,可能需要檢查 log 記錄檔來排除。

郵件設定檔

Laravel 針對郵件部分的設定檔位於 app/config/email.php 檔案中,大致上的設定檔內容如下(為了簡潔移除註解部分),僅對特別部分進行說明:

<?php
return array(
    'driver' => 'smtp',
    'host' => 'smtp.gmail.com',
    'port' => 465,
    'from' => array(
        'address' => 'yourAccount@gmail.com',
        'name' => 'Your Name Or Compnay Name',
    ),
    'encryption' => 'ssl',
    'username' => 'yourAccount@gmail.com',
    'password' => 'zvthqxblhekeqvqo',
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
);

Gmail 提供了兩種連線方式來寄送郵件。分別是 TLS(port:587)SSL(port:465) ,所以請依照需求,各別設定對應的 portencryption 兩個參數。

password 部分,如果你已經申請了 Google 的手機驗證登入方法(也就是你登入 Gmail 需要輸入 Google 發送給你的簡訊碼),這時候就不能使用一般登入 Gmail 的密碼,而是使用透過 Google 產生的 應用程式專用密碼。我們可以從 個人帳戶頁面»安全性»已連結的應用程式和網站 來建立一組新密碼。

google-gen-password.png

Google 系統將產生一組密碼如下圖。雖然顯示的時候,每四個字母有一個空白,但在使用的時候,請忽略空白的部分。

google-app-password.png

最後,記得將 pretend 參數設定為 false ,否則 Laravel 不會呼叫 SwiftMail 進行寄送,而是將郵件內容寫到應用程式的 log 檔案來進行模擬。

郵件發送測試

這邊我們直接在路由 app/routes.php 寫個簡易的郵件寄送程式範例如下:

<?php
Route::get('gmail_test', function()
{
    // 為了測試,我們將寄送給自己
    $address = Config::get('email.username');

    // 系統會將資料變數 $data 套用到視圖 `app/views/emails/auth/test.blade.php`中後發送
    $data = array('token' => '123456');
    Mail::send('emails.auth.reminder', $data, function($message) use ($address)
    {
        // $message 是一個 SwiftMailer 物件,你可以呼叫在 SwiftMailer 類別中
        // 的任何方法去來設定此封郵件
        $message->to($address)->subject('Laravel Mail By Gmail');
    });
});

感謝 Kejyun 提醒如果在匿名函式要使用外部的變數,必需使用 use() 這個方法,注意必需在版本 5.3 後才支援,詳細可以參考 PHP 官方說明] (2013-08-25 補記)

接著我們在瀏覽器輸入 http://127.0.0.1/your-laravel/public/gmail_test 測試發送。如果寄送成功,就可以收到一封透過 Gmail 送給自己的郵件。

gmail-test.png

目錄

  1. 1. 環境確認
  2. 2. 郵件設定檔
  3. 3. 郵件發送測試