Laravel进阶系列笔记--(二十五)Laravel 基于Notification邮件通知的快速使用

作者: 温新

分类: 【Laravel】

阅读: 2338

时间: 2021-09-02 11:17:06

作者:温新

时间:2021-07-31

hi,我是温新,一-名PHPer。

本系列采用Laravel8.x演示。

之前的文章记录过发送邮件,邮件就是通知的一种。除了邮件外短信也是通知。比如说微信支付,当支付后会有一个支付金额的通知。

消费通知介绍

Laravel支持多种消息通知,如邮件、短信、Slack等。通知还能存储到数据库以便后续在 Web 页面中显示。

应用场景

举例:如用户注册后,发送一封邮件通知用户注册成功,根据 Laravel7使用QQ邮箱发送邮件详解 这篇文章的介绍就可以实现,即用户注册成功后,下一行代码就是发送邮件的代码。如果后期需要使用短信或拿用户信息做些其它功能,那么代码就会变得臃肿,难以维护且不可复用。

而消息通知简化了这些操作,使得代码更加优雅可读。

通知可以有多种方式实现,如Laravel事件监听、消息通知、队列都可以实现,后续将这些功能结合起来做一个学习式温习式记录。

Notification邮件通知

对于邮件通知,我这里使用QQ邮件作为演示。

我这里使用了广播时的数据库,因此用户表中是有数据的,发送邮件基于用户表发送。

第一步:配置服务

// .env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com               // 邮箱服务器
MAIL_PORT=465                       // 端口
MAIL_USERNAME=xyhcx@foxmail.com@qq.com      // 邮件发送者名称(自己)
MAIL_PASSWORD=****************      // 邮件秘钥(开通服务后的秘钥)
MAIL_ENCRYPTION=ssl                 // 加密传输
MAIL_FROM_ADDRESS=xyhcx@foxmail.com@qq.com  // 邮件发送者地址(自己)这个必须与MAIL)USERNAME一致
MAIL_FROM_NAME=ziruchu              // 发送者名称,可自定义

第二步:创建消息通知

php artisan make:notification SendUserRegisterEmail

该命令会在app/Notifications目录下生成对应的通知类文件。该通知文件中默认有,其中via为消息构建方法,用于将通过转为特定渠道优化的消息。

第三步:定义路由

// web.php
// 发送邮件
Route::get('send','TestController@send');
// 邮件成功后的跳转页面
Route::get('succ', function(){
    return '消息邮件发送成功';
});

第四步:创建控制器与方法

1)控制器

php artisan make:TestController

2)方法

// TestController.php
public function send()
{
}

第三步:编写邮件消息通知类

// Notifications/SendUserRegisterEmail.php
<?php
namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class SendUserRegisterEmail extends Notification
{
    use Queueable;
	 // 用户实例信息
    public $user = null;

    public function __construct($user)
    {
        $this->user = $user;
    }
    // 哪种通知
    public function via($notifiable)
    {
        return ['mail'];
    }

    // 邮件发送的内容
    // $notifiable接收的同样是用户实例信息
    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!');
    }

    public function toArray($notifiable)
    {
        return [];
    }
}

第四步:模拟注册用户进行发送邮件

懒,不去创建登录页面了,直接模拟用户注册。

1)方式一:控制器层发送邮件。修改send方法

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\SendUserRegisterEmail;
use Illuminate\Support\Facades\Notification;

public function send()
{
    // 模拟用户注册
    $user = User::create([
        'name'  =>  '赵六',
        'email' =>  '3413648628@qq.com',
        'password' =>  encrypt('123456'),
    ]);
    // 为注册用户发送邮件
    Notification::send($user, new SendUserRegisterEmail($user));
}

2)方式二:模型层调用

User模型中发送邮件

// Models/User.php

// 添加用户并发送邮件
public static function sendMail()
{
    // 创建用户
    $user = self::create([
        'name'  =>  '赵六',
        'email' =>  '3413648628@qq.com',
        'password' =>  encrypt('123456'),
    ]);
    // 发送邮件
    $user->notify(new SendUserRegisterEmail($user));
    return $user;
}

修改控制器中的send方法

// TestController.php
<?php

namespace App\Http\Controllers;

use App\Models\User;

public function send()
{
    $user = User::sendMail();
}

这两方式可以单独演示。目前使用的是默认的发送信息,定义的发送成功后的跳转路由也没有用到,下面将开始自定义发送邮件的内容。

第五步:访问路由发送邮件

方式:你的域名/send

到这里,邮件发送已经完成。下面的操作为自定义操作。

其他自定义操作

基本信息操作

为了方便起见,我这里修改了控制器中的send方法,取出一个用户对它进行发送邮件。

// TestController.php
$user = User::find(9);
Notification::send($user, new SendUserRegisterEmail($user));

自定义基本信息

// Notifications/SendUserRegisterEmail.php

public function toMail($notifiable)
{
    return (new MailMessage)
        // 邮件主题
        ->subject('注册成功')
        // 通知小标题
        ->greeting($this->user->name . '您好: ')
        // 行文本信息
        ->line('您于' . $this->user->created_at->format('Y-m-d H:i:s').'注册为自如初网站用户')
        ->line('自如初一个PHP记录博客')
        // 生成按钮地址
        ->action('验证', url('succ'))
        // 按钮样式
        ->level('success');
}

自定义邮件模板

可以看到,使用自定义的通知时会有默认的模板,若不想用默认的模板则需要自自定义,好在自定义模板很简单。

1)修改控制器方法

// Notifications/SendUserRegisterEmail.php

public function toMail($notifiable)
{
    return (new MailMessage)
        ->subject('注册成功')
        // 自定义模板 email
        ->view('email',['user'=>$this->user]);
}

2)定义邮件通知模板

// resources/views/email.blade.php

<h1>自如初</h1>
<p>欢迎 {{ $user->name }}</p>
<p>这里是自如初学习记录网站</p>

邮件预览

在设计邮件模板时,可以通过预览来确定是否是自己所想要的模板,邮件预览使用toMail方法。

修改控制器方法

// TestController.php
public function send()
{
    $user = User::find(9);
    // 访问路由时返回邮件模板
    return (new SendUserRegisterEmail($user))->toMail($user->user);
}

还是Markdown语法模板邮件,这里就不记录了。若想快速使用Markdown通知模板,请参考 Laravel进阶系列笔记--(18)Laravel 发送邮件

我是温新

每天进步一点点,就一点点

请登录后再评论