🔏
Laravel 4.2 入門
  • 前言
  • Laravel 介紹
    • Laravel 介紹
    • 認識 Laravel
    • 開始之前
  • 進入 Laravel 的世界
    • 進入 Laravel 的世界
    • 安裝 Composer
    • 建立 Laravel 專案
    • Laravel 框架目錄說明
    • Artisan 常用指令說明
  • 基本配置設定
    • 基本配置設定
    • 設定伺服器
    • 建立開發環境
    • 設定 Laravel 網站
  • 動手做-入門
    • 動手做-入門
    • Laravel 的 MVC 模型
    • 使用 Route
    • 使用 View
    • 使用 Controller
    • 使用 Migration 和 Model
    • 使用 Form
    • 第一個小專案:迷你部落格
  • 動手做 - 進階
    • 動手做 - 進階
    • Route 進階
    • Blade 樣板系統
    • Form 進階
    • Form 的資料驗證
  • 資料庫
    • 資料庫
    • Query Builder
    • Eloquent ORM
    • Schema Builder
    • Migrations & Seeding
  • 常用功能實作
    • 常用功能實作
    • 登入驗證
    • 在地化 (多國語言)
    • 分頁
    • 寄信
  • 附錄
    • 附錄
    • 移除 public 結尾
    • Sublime Text 的開發套件
Powered by GitBook
On this page
  • 介紹
  • 使用 Gmail SMTP
  • 寄信
  • Controller 的部份
  • View 的部份
  • 非同步寄送

Was this helpful?

  1. 常用功能實作

寄信

Previous分頁Next附錄

Last updated 5 years ago

Was this helpful?

介紹

Laravel 使用 [1] library 來處理寄信的功能,並在其上提供一個 API 讓操作更簡單。

mail 的相關設定在:

app/config/mail.php

driver 預設是 'smtp'。如果你要使用 PHP 的 mail 函式,可以改為 'mail'。其他可用的還有 'sendmail'、'mailgun'、'mandrill'及'log'。

使用 log 的話,Laravel 就不會真的寄信,而是把要寄出的信寫入 log 檔。log 檔的位置在

app/storage/logs

使用 Gmail SMTP

假設你要使用 Gmail SMTP 來寄信,設定如下:

'driver' => 'smtp',
'host' => 'smtp.gmail.com',
'port' => 587,
'username' => '你的gmail帳號',
'password' => 'gmail的密碼',

這裡有點要小心,因為你是以明碼填入你的 gmail 密碼,所以請小心防止這個檔案被查看(或是另外申請一個,絕對不要把自己常用的 gmail 帳號拿來使用)。

寄信

通常的寄信情境是,使用者填完表單後才寄送,所以在 Controller 中做驗證表單資料的動作,最後一個步驟才是寄信。

Controller 的部份

大概的程式碼會是:

//從表單取得資料
$from = ['email'=>$input['email'],
         'name'=>$input['name'],
         'subject'=>$input['subject']
        ];

//填寫收信人信箱
$to = ['email'=>'xxx@xxx.com',
       'name'=>'xxx'];

//信件的內容(即表單填寫的資料)
$data = ['company'=>$input['company'],
         'address'=>$input['address'],
         'email'=>$input['email'],
         'subject'=>$input['subject'],
         'msg'=>$input['message']
         ];

//寄出信件
Mail::send('emails.post', $data, function($message) use ($from, $to) {
    $message->from($from['email'], $from['name']);
    $message->to($to['email'], $to['name'])->subject($from['subject']);
        });

Mail::send() 方法第一個參數是自定的 view。第二個是要寄送的資料,第三個 function 會有一個 $message 用來指定 from 、to等資訊,如果要同時寄送副本,可以在 to 之後串接 cc:

$message->to($to['email'], $to['name'])->cc('abc@mail.com')

如果要在 function 中用到外部的變數,像是這個的 $from 及 $to,要使用 use(變數名稱) 。

夾帶檔案:

$message->attach('檔案路徑');

View 的部份

新增 app/views/emails/post.blade.php:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h2>{{ $subject }}</h2>
        <div>{{ $msg }}</div>
        <br><br>
        <div><b>公司名稱:</b> {{ $company }}</div>
        <div><b>公司地址:</b> {{ $address }}</div>
        <div><b>email:</b> {{ $email }}</div>
    </body>
</html>

資料全都由前面提到的 Mail::send() 中的 $data 所傳遞。

非同步寄送

使用 Mail::send() 方法會在寄送完成後才返回控制權,這時候網頁看起來會像是停住了。這時候可以改用 Mail::queue(),參數都一樣,只是它會送進佇列後,在背景等待傳送,這樣就不會讓網頁看起來像是停住了。

另外,也可以用 Mail::later(10, 其餘參數相同) 來延遲寄送,參數相同,但在最前面多一個延遲秒數的參數。

[1]

SwiftMailer
http://swiftmailer.org/