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, 其餘參數相同) 來延遲幾秒後寄送,參數相同,但在最前面多一個秒數的參數。
你好
回覆刪除我照您的方法去做 想把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)
請問是什麼原因啊
$data = [
刪除'name'=>$request->input('name'),
'email'=>$request->input('email'), <--- 是不是這裡多一個逗號的關係
];
作者已經移除這則留言。
回覆刪除