環境
基於 Laravel Framework 5.5.45,使用自帶的SMTP協議提供驅動。
Laravel支持多種郵件驅動方式,包括smtp、Mailgun、Maildrill、Amazon SES、mail和sendmail,Mailgun和Amazon SES都是收費的Maildrill目前不支持中國區用戶,這三個都是第三方郵件服務。mail驅動使用PHP提供的mail函數發送,sendmail驅動通過Sendmail/Postfix(Linux)提供的命令發送郵件,smtp驅動通過支持ESMTP的SMTP發送郵件。
就目前狀況來看,使用smtp是最明智的選擇,mail不安全,sendmail需要安裝配置Sendmail/Postfix,其他要么付費要么不能用。
第一步 laravel 郵箱配置
hotmail 獲取郵箱授權碼 Gmail獲取郵箱授權碼
laravel只需要配置.env即可。
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=你的Gmail郵箱地址
MAIL_PASSWORD=你的Gmail郵箱地址對應的授權密碼(不是登錄密碼)
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS="你的Gmail郵箱地址 |這項需要和MAIL_USERNAME一模一樣"
MAIL_FROM_NAME="發件人名稱"
Notice: MAIL_ENCRYPTION可以根據需要修改,但是如果不使用ssl,也需要修改MAIL_PORT為25端口
生成 Mailable 對象
在 Laravel 中,每種類型的郵件都代表一個「Mailable」對象。這些對象存儲在 app/Mail 目錄中。如果在你的應用中沒有看見這個目錄,別擔心,在首次使用 make:mail 命令創建 Mailable 類時這個目錄會被創建,例如:
php artisan make:mail OrderShipped
編寫 Mailable
使用 from 方法
首先,演示配置郵件的發送者,也就是郵件的參數 「from」,既誰發送了郵件。有兩種方法配置發送者。第一種是你可以在 build 方法中使用 from 方法:
form方法一定要填寫第二個參數,不然會報錯 Swift_TransportException: Expected response code 250 but got code "501", with message "501
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com這里填郵箱','這里添寫發送人名稱,不然會報錯的')
->view('emails.orders.shipped');
}
配置視圖
在 build 方法內,你可以使用 view 方法指定郵件的模板,以渲染郵件的內容。因為所有郵件都會使用 Blade 模板 渲染內容,你能很容易的使用 Blade 模板引擎構建郵件的 HTML:
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}
{tip} 你可以創建一個 resources/views/emails 目錄來存放所有的郵件模板;然而,這不是強制要求,你可以在有的將郵件模板放在 resources/views 目錄的任意位置。
通過 subject 方法設置郵件主題
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->subject('xxx'); // 郵件主題
}
通過 with 方法向模板傳參:
你可以使用 with 方法來傳遞數據給模板。一般情況下,你仍然是使用 Mailable 類的構造函數來接受數據傳參。然而你需要為這些數據屬性設置 protected 或 private 聲明,否則這些數據會被自動加載到模板中。接下來你可以使用 with 方法接受鍵值數組傳參來傳遞數據給模板,就如控制器里為視圖傳參一樣:
<?php
namespace App\Mail;
use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* order 實例。
*
* @var Order
*/
protected $order;
/**
* 創建一個新消息實例。
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* 構建消息。
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->with([
'orderName' => $this->order->name,
'orderPrice' => $this->order->price,
]);
}
}
一旦數據已經用 with 方法傳遞,它們將自動在視圖中加載,所以你可以訪問像訪問其他 Blade 模板數據一樣訪問它們:
<div>
Price: {{ $orderPrice }}
</div>
發送郵件
要發送郵件,使用 Mail facade 的 to 方法。 to 方法接受一個郵件地址,一個 user 實現或一個 users 集合。如果傳遞一個對象或集合,mailer 將自動使用 email 和 name 屬性來設置郵件收件人,所以確保你的對象里有這些屬性。一旦指定收件人,你可以傳遞一個實現到 Mailable 類的 send 方法:
<?php
namespace App\Http\Controllers;
use App\Order;
use App\Mail\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;
class OrderController extends Controller
{
/**
* Ship the given order.
*
* @param Request $request
* @param int $orderId
* @return Response
*/
public function ship(Request $request, $orderId)
{
$order = Order::findOrFail($orderId);
// Ship order...
Mail::to($request->user())->send(new OrderShipped($order));
}
/**
* 這個是我的改造的demo
* 發送郵件
*/
public function sendEmail(Request $request)
{
$email = $request->input('email');
$verify_code = $request->input('verify_code');
$return = ['code' => 0, 'msg' => '成功'];
$email_preg = '/^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.|-]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$/';
if (!preg_match($email_preg, $email)) {
return ['code' => 1, 'msg' => '郵箱格式錯誤'];
}
$code_preg = '/^[0-9]{6}$/';
if (!preg_match($code_preg, $verify_code)) {
return ['code' => 2, 'msg' => '驗證碼格式錯誤'];
}
try {
Mail::to($email)->send(new Email($verify_code));
} catch (\Error $error) {
$return = ['code' => 4, 'msg' => '郵件發送失敗'];
}
return $return;
}
}
