博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel——邮件发送
阅读量:5891 次
发布时间:2019-06-19

本文共 4027 字,大约阅读时间需要 13 分钟。

安装

所有的 API 驱动要求应用已经安装 Guzzle HTTP 库,你可以通过 Composer 包管理器来安装它:

composer require guzzlehttp/guzzle复制代码

配置

.env

MAIL_DRIVER=smtpMAIL_PORT=465MAIL_HOST=smtp.qq.comMAIL_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 目录来存放所有邮件模板

public function build(){    return $this->view('emails.orders.shipped');}复制代码

视图数据

通过公共属性

通常,我们需要传递一些数据到渲染邮件的 HTML 视图以供使用。有两种方式将数据传递到视图,首先,您的 mailable 类中定义的任何公共属性将自动传递给视图。 因此,您可以将数据传递到 mailable 类的构造函数,并将该数据设置为类的公共属性

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 模板中访问其它数据一样访问它们:

Price: {
{ $order->price }}
复制代码

通过 with 方法

如果你想要在数据发送到模板之前自定义邮件数据的格式,可以通过 with 方法手动传递数据到视图。一般情况下,你还是需要通过可邮寄类的构造器传递数据,不过,这次你需要设置数据为 protected 或 private 属性,这样,这些数据就不会在视图中自动生效。然后,当调用 with 方法时,传递数组数据到该方法以便数据在视图模板中生效:

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 模板访问其它数据一样访问传递过来的数据:

Price: {
{ $orderPrice }}
复制代码

发送邮件

若要发送邮件,使用 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{    //}复制代码

修改配置信息,队列存储为redis

.env

QUEUE_CONNECTION=redis复制代码

修改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){}复制代码

转载于:https://juejin.im/post/5cb8120b518825324c44efe3

你可能感兴趣的文章
pixel2坑
查看>>
20135337朱荟潼 Linux第三周学习总结 ——Linux内核源代码简介
查看>>
开源工具、平台列表
查看>>
oracle 字段类型
查看>>
linux 内存布局以及tlb更新的一些理解
查看>>
C语言最后一次作业--总结报告
查看>>
wpf 自动完成comboxBox
查看>>
day11 作用域
查看>>
asyncio python中的异步IO处理模块
查看>>
CentOS 漏洞修补
查看>>
Systemverilog for design 笔记(四)
查看>>
111:TemplateView讲解
查看>>
Guava包学习---I/O
查看>>
elixir 高可用系列(三) GenEvent
查看>>
关于使用AIDL出现空指针的解决办法
查看>>
在Windows窗体中开发自定义的控件
查看>>
传值引用和调用引用的区别
查看>>
Linux & Oracle目录说明
查看>>
Oracle instant client及pl sql developer的使用
查看>>
转:MySQL索引背后的数据结构
查看>>