全部的 API 驱动要求应用已经安装 Guzzle HTTP 库,你能够经过 Composer 包管理器来安装它:php
composer require guzzlehttp/guzzle
复制代码
.env
redis
MAIL_DRIVER=smtp
MAIL_PORT=465
MAIL_HOST=smtp.qq.com
MAIL_USERNAME=qq邮箱
MAIL_PASSWORD=不是登录密码,是POP3/SMTP码
MAIL_FROM=
MAIL_ENCRYPTION=ssl
复制代码
在 Laravel 中,应用发送的每一封邮件均可以表示为 “可邮寄” 类,这些类都存放在 app/Mail 目录。若是没看到这个目录,别担忧,它将会在你使用 make:mail 命令建立第一个可邮寄类时生成:数组
php artisan make:mail OrderShipped
复制代码
public function build()
{
return $this->from('example@example.com')
->view('emails.orders.shipped');
}
复制代码
你能够建立一个 resources/views/emails 目录来存放全部邮件模板bash
public function build()
{
return $this->view('emails.orders.shipped');
}
复制代码
经过公共属性app
一般,咱们须要传递一些数据到渲染邮件的 HTML 视图以供使用。有两种方式将数据传递到视图,首先,您的 mailable 类中定义的任何公共属性将自动传递给视图。 所以,您能够将数据传递到 mailable 类的构造函数,并将该数据设置为类的公共属性composer
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* 订单实例.
*
* @var Order
*/
public $order;
/**
* 建立一个新的消息实例.
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* 构建消息.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}
}
复制代码
数据被设置给公共属性后,将会在视图中自动生效,因此你能够像在 Blade 模板中访问其它数据同样访问它们:函数
<div>
Price: {{ $order->price }}
</div>
复制代码
经过 with 方法ui
若是你想要在数据发送到模板以前自定义邮件数据的格式,能够经过 with 方法手动传递数据到视图。通常状况下,你仍是须要经过可邮寄类的构造器传递数据,不过,此次你须要设置数据为 protected 或 private 属性,这样,这些数据就不会在视图中自动生效。而后,当调用 with 方法时,传递数组数据到该方法以便数据在视图模板中生效:this
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* 订单实例.
*
* @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 模板访问其它数据同样访问传递过来的数据:spa
<div>
Price: {{ $orderPrice }}
</div>
复制代码
若要发送邮件,使用 Mail facade 的 to 方法。 to 方法接受 邮件地址、用户实例或用户集合。若是传递一个对象护着对象集合,mailer 在设置收件人时将自动使用它们的 email 和 name 属性,所以请确保对象的这些属性可用。一旦制定了收件人,就能够将 mailable 类实例传递给 send 方法:
class OrderController extends Controller
{
/**
* 发送给定的订单。
*
* @param Request $request
* @param int $orderId
* @return Response
*/
public function ship(Request $request, $orderId)
{
$order = Order::findOrFail($orderId);
// 发送订单...
Mail::to($request->user())->send(new OrderShipped($order));
}
}
复制代码
再发送消息时不止能够指定收件人。还能够经过链式调用「to」、「cc」、「bcc」一次性指定抄送和密送收件人:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderShipped($order));
复制代码
若是一个 mailable 类终是要队列化,能够在此类上实现 ShouldQueue 契约。这样一来,即便你在发送时调用了 send 方法, mailable 也将被序列化:
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Mailable implements ShouldQueue
{
//
}
复制代码
.env
QUEUE_CONNECTION=redis
复制代码
config/database.php
'redis' => [
...
'mail' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 2),
],
],
复制代码
config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'mail',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
复制代码
Mail/NoticeMail
public $tries = 20; //尝试次数
public $timeout = 120;//超时时间
复制代码
队列执行成功,会从reids里删除
须要根据文档,迁移失败的表,执行失败以后,会存到表中。
若是设置,超时时间和尝试次数,达到失败条件以后会从redis中删除,不然,失败队列会继续在redis中,每次启动都会继续执行
处理失败的方法
public function failed(\Exception $exception)
{
}
复制代码