如何在 make:auth 之后用 QQ 邮箱发送自定义密码重置

2018-10-09  本文已影响19人  晨曦入诗

生成授权码


使用 Laravel 发送 QQ邮件使用的不是 QQ邮箱号和密码,而是 QQ邮箱号和授权码(QQ 推出的用于登录第三方客户端的专用密码)。生成授权码的步骤如下:

进入 QQ 邮箱网页版 → 设置 → 账户 → (开启)POP3/SMTP 服务 → (点击)生成授权码。

需要注意的是授权码一定要妥善保存,避免因为泄露带来的不必要麻烦。

配置 .env

APP_URL=http://homestead.app

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=25
MAIL_USERNAME=邮箱号
MAIL_PASSWORD=授权码
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=${MAIL_USERENAME}
MAIL_FROM_NAME=测试邮件

将 「邮箱号」、「授权码」换成你的就可以了。

创建邮件

php artisan make:mail ResetPassword --markdown

修改 ResetPassword.php

<?php

namspace App\Mail;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class ResetPassword extends Mailable
{
    use Queueable, SerializesModels;

    public $token;
    public $username;
    /**
     * Create a new message instance.
     *
     * @return void
     */
     public function __construct($token, $username)
     {
         $this->token = $token;
         $this->username = $username;
     }

     /**
     * Build the message.
     *
     * @return $this
     */
     public function build()
     {
            return $this->subject('密码重置')
                        ->markdown('emails.reset_password');
     }
}

邮件内容在 views/emails/reset_password.blade.php 现在创建它:

@component('mail::message')
# 密码重置

你好,{{ $username }} !点击下面的链接重置密码。
@component('mail.botten', ['url' => url(config('app.url').route('password.reset', $token, false))])
重置密码
@endcomponent

如果非本人操作,请忽略这封邮件。

你的,<br>
{{ config('app.name') }}
@endcomponent

重写发送密码重置邮件的方法

Laravel 内置有发送邮件功能,最终发送邮件的方法是调用 Illuminate\Auth\Passwords\CanResetPassword 这个 trait 的 sendPasswordResetNotification 方法。

/**
 * Send the password reset notification.
 *
 * @param  string  $token
 * @return void
 */
public function senPasswordResetNotification($token)
{
     $this->notify(new ResetPassword($token));
}

User Model 使用了这个 trait ,所以在 Model 中重写 sendPasswordResetNotification 方法就可以将密码重置邮件更改为刚才自定义的。
下面为 User Model 添加方法 sendPasswordResetNotification

use Mail;
use App\Mail\ResetPassword;

public function sendPasswordResetNotification($token)
{
     Mail::to($this->email)->send(new ResetPassword($token, $this->name));
}
上一篇下一篇

猜你喜欢

热点阅读