[Laravel 5.3 新功能] 12. Mail 操作类 Laravel Mailable

说明

此文章是 [Laravel 5.3 新功能] 系列的第十二篇文章,Mail 操作类 Laravel Mailable。

[Laravel 5.3 新功能] 系列完整文章列表请见:分享:[Laravel 5.3 新功能] 系列文章

5.3 以前的发邮件方式

在很长的一段时间里,Laravel 发邮件的实现代码比较繁琐,比如在 5.2 里是这样发邮件的:

Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
    $m->from('hello@app.com', 'Your Application');

    $m->to($user->email, $user->name)->subject('Your Reminder!');
});

我并不是说这种方式不好,但是比起其他的发邮件框架,它比较容易让人迷惑。

什么是 Mailables

在 Laravel 5.3 里,所有的发邮件逻辑都将单独使用一个 PHP 类实现,如 “NewUserWelcome” 或者 “PaymentReceipt”。它的使用机制类似于事件 (event),每个发邮件事件对应一个类,并且对外只有提供一个简单的 send 语法,你只要将对应的 email 实例传入即可实现发邮件功能。

举个例子,我们给用户发提醒邮件将这样调用:

Mail::to($user)->send(new Reminder);

在此之前,我们需通过 Artisan 命令创建 Reminder:

php artisan make:mail Reminder

命令运行成功后,程序会自动生成 app/Mail/Remider.php 文件,我们打开此文件可以看到如下内容:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Reminder extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }
}

注意,在这个文件,所有的邮件操作逻辑要在 build() 方法里写,我们现在就在此方法里给用户发邮件:

public function build()
{
    return $this->from('hello@app.com', 'Your Application')
        ->subject('Your Reminder!')
        ->view('emails.reminder');
}

注意:你可以不填写邮件的标题,Laravel 会根据你的类名自动填写标题。如你的类名为 MonkeyReminder,则默认的标题为 Monkey Reminder

传输数据

如果我们想传入一些数据给标题或者是邮件模板呢?我们可以这样写:

Mail::to($user)->send(new Reminder($event));
class Reminder extends Mailable
{
    public $event;

    public function __construct($event)
    {
        $this->event = $event;
    }

    public function build()
    {
        return $this->from('hello@app.com', 'Your Application')
            ->subject('Event Reminder: ' . $this->event->name)
            ->view('emails.reminder');
    }
}

在 mailable 类里的所有属性都能在 view 里调用:

// resources/views/emails/reminder.blade.php
<h1>{{ $event->name }} is coming up soon!</h1>
<p>Lorem ipsum.</p>

但如果想在模板里定义指定的数据呢?你可以通过使用 with() 方法来完成:

public function build()
{
    return $this->from('hello@app.com', 'Your Application')
        ->subject('Event Reminder: ' . $this->event->name)
        ->view('emails.reminder')
        ->with(['title' => $this->event->name]);
}

配置邮件发送对象

我们可以使用下面的方法将邮件 cc 和 bcc 给其他人:

Mail::to(User::find(1))
    ->cc(User::find(2))
    ->bcc(User::find(3))
    ->send(new Reminder);

// These methods also accept collections
Mail::to(Users::all())
    ->send(new Reminder);

Plaintext 视图

现在有一个新的方法 text() 可以在 view() 方法后使用,调用此方法可以发送 Plaintext 类型的邮件。

public function build()
{
    return $this->view('emails.reminder')
        ->text('emails.reminder_plain');
}

队列

调用下面的代码可以将发邮件的逻辑放入队列:

Mail::to($user)->queue(new Reminder);

你还可以使用 later() 设置邮件延时发送

$when = Carbon\Carbon::now()->addMinutes(15);

Mail::to($user)->later($when, new Reminder);

添加附件

你可以在上述的 build() 方法里使用 attach() 添加附件:

public function build()
{
    $this->view('emails.reminders')
        ->attach('/path/to/file', [
            'as' => 'name.pdf',
            'mime' => 'application/pdf',
        ]);
}

你也可以使用 attachRaw 添加 raw data:

public function build()
{
    $this->view('emails.reminders')
        ->attachRaw($this->pdf, 'name.pdf', [
            'mime' => 'application/pdf',
        ]);
}

全文完。

链接

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
monkey
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2
Chasers9527

为嘛不做成一个系列的。放在顶部。。有助于更加清晰。。。都在列表里面。查找起来不是太好查找

做的很好,赞一个

2年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会