Laravel 學習筆記(22) - 寄信 (mail)

Laravel Mail

Laravel 使用 SwiftMailer library 來處理寄信的功能,並在其上提供一個 API 讓操作更簡單。設定檔在 app/config/mail.php ,driver 預設是 'smtp'。如果你要使用 PHP 的 mail 函式,可以改為 'mail',其他可用的還有 'sendmail'、'mailgun'、'mandrill'及'log'。設定成 log 的話,Laravel 就不會真的寄信,而是把要寄出的信寫入 log 檔。

使用 Gmail SMTP

假設你要使用 Gmail SMTP 來寄信,設定如下:
'driver' => 'smtp',
'host' => 'smtp.gmail.com',
'port' => 587,
'username' => '你的gmail帳號',
'password' => 'gmail的密碼',
!這裡有點要小心,因為你是以明碼填入你的 gmail 密碼,所以請小心保護這個檔案。(或是另申請一個gmail)

寄信

通常的寄信情境是,使用者填完表單後寄送。我們會在 Controller 中驗證完表單資料後,才使用 Mail 類別來寄信。

Controller

大概的程式碼會是:
//從表單取得資料
$from = ['email'=>$input['email'],
         'name'=>$input['name'],
         'subject'=>$input['subject']
        ];

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

//信件的內容(即表單填寫的資料)
$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']);
        });
在寄出信件前,通常會先檢查 Input 中的資料,在Form 表單資料驗證這篇文章中有說到,驗證沒問題了在把資料送給 Mail::send() 去寄送。這裡省略這部份程式碼。

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

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, 其餘參數相同) 來延遲幾秒後寄送,參數相同,但在最前面多一個秒數的參數。
本文網址:http://blog.tonycube.com/2015/01/laravel-22-mail.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

3 則留言

  1. 你好
    我照您的方法去做 想把Controller 裡的變數傳到信件裡 卻發生錯誤


    $from =[
    'email'=>$request->input('email'),
    ];

    $to = [
    'name'=>$request->input('name')
    ];
    $data = [
    'name'=>$request->input('name'),
    'email'=>$request->input('email'),

    ];


    //信件內容網頁
    Mail::send('emails.registered', $data, function ($m) use ($from,$to) {

    傳送後 會出現 ErrorException in 407c54f9efd97823548d84f6fe316be1 line 60:
    Undefined variable: data (View: /home/leiceslc/public_html/resources/views/emails/registered.blade.php)


    請問是什麼原因啊

    回覆刪除
    回覆
    1. $data = [
      'name'=>$request->input('name'),
      'email'=>$request->input('email'), <--- 是不是這裡多一個逗號的關係

      ];

      刪除

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。