Laravel 邮箱验证 全过程

一、官方说:

官方文档里说了,首先迁移数据库:

php artisan migrate

然后Auth路由中添加认证:

Auth::routes(['verify' => true]);

还有保护路由的中间键:(进入profile便可以去认证邮件的路由:email/verify

Route::get('profile', function () {
    // 只有验证过的用户可以进入
})->middleware('verified');

二、我说:

然而漏了好多。

首先如果没有在User模型中将类名添加一段implements MustVerifyEmail将无法认证。所以需要改成这样:

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

.env文件中要修改邮件发送服务器的配置,默认是这样的,smtp.mailtrap.io是一个Demo测试的服务器,可以去mailtrap.io注册体验下,但是它不是真正的发送,是模拟发送的,所以,需要改其他东西。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

以qq的为例子,要去获取第三方登录密匙,是一串随机英文,最后得出:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465(或587)
MAIL_USERNAME=moe-boshi@qq.com
MAIL_PASSWORD=(16位英文)
MAIL_ENCRYPTION=ssl

但是,这个是原先Demo的方法发送,也就是模拟,在qq邮箱上是无法模拟,所以需要在config/mail.php中修改第59行左右的MAIL_FROM_ADDRESS 改成 MAIL_USERNAME,最后为这样:

'from' => [
        'address' => env('MAIL_USERNAME', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', '(改成你的邮箱发送者名字)'),
    ],

这样改完才能够发送出去。

三、模版修改:

首先,发送过去的都是英文,如果是中国人用总不可能都是英文吧,那肯定要修改下模版,邮箱验证发送页面就不说了,就在现成的view文件夹内,主要是发送出去的邮件,有两种邮件,一个是邮箱验证,一个是密码修改,最简单的就是把在框架内的都取出来,两个命令:

$ php artisan vendor:publish --tag=laravel-mail
Copied Directory [/vendor/laravel/framework/src/Illuminate/Mail/resources/views] To [/resources/views/vendor/mail]
Publishing complete.
$ php artisan vendor:publish --tag=laravel-notifications
Copied Directory [/vendor/laravel/framework/src/Illuminate/Notifications/resources/views] To [/resources/views/vendor/notifications]
Publishing complete.

我将发送命令后的成果都输出了,也就是说它把在框架中的视图放到了外面,从而我们修改外面的文件就行了,甚至css样式也出来了。

我们可以翻译@lang()中的部分英文,另外,可以在User模型中重写两个邮件方法:

//重写『密码重置』邮件 方法
    public function sendPasswordResetNotification($token)
    {
        \Illuminate\Auth\Notifications\ResetPassword::toMailUsing(function ($notifiable, $token) {
            return (new \Illuminate\Notifications\Messages\MailMessage)
                ->subject('重置密码通知')
                ->line('您收到此电子邮件是因为我们收到了您帐户的密码重置请求。')
                ->action('重设密码', url(config('app.url') . route('password.reset', $token, false)))
                ->line('如果您未请求重置密码,则无需操作。');
        });

        $this->notify(new \Illuminate\Auth\Notifications\ResetPassword($token));
    }

    //重写『 邮箱验证』邮件 方法
    public function sendEmailVerificationNotification()
    {
        \Illuminate\Auth\Notifications\VerifyEmail::toMailUsing(function ($notifiable) {
            return (new \Illuminate\Notifications\Messages\MailMessage)
                ->greeting('您好!')
                ->subject('验证邮箱')
                ->line('请点击下面的按钮验证您的邮箱。')
                ->action(
                    '验证邮箱',
                    \Illuminate\Support\Facades\URL::temporarySignedRoute(
                        'verification.verify', now()->addMinutes(60), ['id' => $notifiable->getKey()]
                    )
                )
                ->line('如果您未创建帐户,则无需操作。')
                ->salutation('为您献上最美好的祝福');
        });

        $this->notify(new \Illuminate\Auth\Notifications\VerifyEmail);
    }

解释一下,MailMessage 是 Laravel 内置的一个快速生成邮件的类。里面有一些内置的方法让我们快速生成格式相同的邮件。方法如下

->subject('邮件主题')

->line('插入一段文字') //可以调用多次来插入多段文字,在 action 方法之前调用则文字显示位置在按钮的上方,在 action 方法之后调用则文字显示在按钮下方

->action('邮件里的按钮标题', '按钮跳转网页链接')

->level('邮件等级') //只能填 info, success, error,用来修改按钮颜色 info 蓝色,success 绿色,error 红色。

->greeting('邮件开头问候语') //如果没有 则问候语根据邮件等级 error 默认是 Whoops!,其他是 Hello!(参考上面的 json 的键)

->salutation('所属站点') //如果没有 则默认显示 Regards,Laravel(参考上面的 json 的键)

另外的方法

(未尝试):

完全不使用 laravel 自带的模板,使用自己做的模板。依旧是在 User.php 这个 model 文件中重写方法。
『密码重置』邮件

    public function sendPasswordResetNotification($token)
    {
        \Illuminate\Auth\Notifications\ResetPassword::toMailUsing(function ($notifiable, $token) {
            return (new \Illuminate\Notifications\Messages\MailMessage)->view(
                'xxx', ['key' => 'value']
            ); // view 方法就是平常的用法,传入自己做的模板做参数
        });

        $this->notify(new \Illuminate\Auth\Notifications\ResetPassword($token));
    }

『 邮箱验证』邮件同上

(失败):

#方法一

为了快速看到效果,我们可以先把 config 文件夹下的 mail.php 第一个键值改成 log

  'driver' => 'log'

再路由改一下,直接访问首页,就能把邮件发送到 storage\logslaravel.log 日志里,

Route::get('/', function () {
  $user = new \App\User();
  $user->id = 1;
  $user->email = 'asdasd@qq.com';
  $user->sendPasswordResetNotification('123'); //发送重置密码邮件
  $user->sendEmailVerificationNotification(); //发送邮箱认证邮件
  dd('发送成功' . now());
});

通过本地化 json文件,把原来的英语翻译成中文。
在 resources\lang 文件夹下面创建 en.json,文件里写上以下内容

{
  "Hello!" : "您好!",
  "Whoops!" : "哦嚯!",
  "Reset Password Notification" : "重置密码通知",
  "You are receiving this email because we received a password reset request for your account." : "您收到此电子邮件是因为我们收到了您帐户的密码重置请求。",
  "Reset Password":"重设密码",
  "If you did not request a password reset, no further action is required.":"如果您未请求重置密码,则无需操作。",
  "Verify Email Address" : "验证邮箱",
  "Please click the button below to verify your email address." : "请点击下面的按钮验证您的邮箱。",
  "If you did not create an account, no further action is required." : "如果您未创建帐户,则无需操作。",
  "Regards" : "在此送上真诚的问候",
  "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: ": "如果您在点击 \":actionText\" 按钮时遇到问题,请将下面链接复制并粘贴到网络浏览器进行访问:",
  "All rights reserved." : "版权所有。"
}

这样邮件里的英文就全部被替换了,邮件中还有一个 Laravel 这个单词是修改 config\app.php 中的 name 这个键的值。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

6 + 17 =