温馨提示: 请在Chrome、Firefox等现代浏览器浏览本站。

「PHP」laravel 项目实现邮箱验证功能

php技术 admin 评论

邮箱验证功能在很多网站都有用到,我的小我私家网站上也用到,邮箱验证需要用到邮件发送服务,Laravel 提供了异常简单的邮件发送 API,Laravel 项目实现邮件发送功能很简单,下面我

邮箱验证功能在很多网站都有用到,我的小我私家网站上也用到,邮箱验证需要用到邮件发送服务,Laravel 提供了异常简单的邮件发送 API,Laravel 项目实现邮件发送功能很简单,下面我最先介绍一下我的具体实现。

邮箱验证

邮箱验证功能实现具体步骤以下:

  1. 添加字段,为用户表添加两个字段,验证令牌 (verification_token) 和验证状态 (verified) 。
  2. 生成令牌。
  3. 用户登录后,检测是不是验证过邮箱,没有则引导去验证。
  4. 使用阿里云企业邮箱发送邮箱验证链接。
  5. 用户点击邮箱验证链接完成验证。

添加字段

使用命令生成迁移文件,命令以下:

$ php artisan make:migration add_verification_to_users_table --table=users

命令会在 database/migrations 目录下生成迁移文件 [timestamp]_add_verification_to_users_table.php,修改迁移文件,修改后以下:

use IlluminateSupportFacadesSchema;use IlluminateDatabaseSchemaBlueprint;use IlluminateDatabaseMigrationsMigration;class AddVerificationToUsersTable extends Migration{ /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { $table->string('verification_token')->nullable(); $table->boolean('verified')->default(false); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('verification_token'); $table->dropColumn('verified'); }); }

接着我运行迁移,将字段加入到用户表中。运行命令以下:

php artisan migrate

生成令牌

我希望用户注册的时候就给用户生成令牌,所以我在 App 目录下建立 Observers 目录,并在 Observers 目录下建立 UserObserver.php 文件,并编写以下代码:

namespace AppObservers;use AppModelsArticle;use AppModelsComment;use AppModelsReply;use AppModelsUser;class UserObserver{ public function creating(User $user) { $user->verification_token=str_random(30); }}

在 app/Providers 目录下的 AppServiceProvider.php 文件中 注册监听 Eloquent 事件,代码以下:

namespace AppProviders;use IlluminateSupportServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * Bootstrap any application services. * * @return void */ public function boot() { AppModelsUser::observe(AppObserversUserObserver::class); } /** * Register any application services. * * @return void */ public function register() { // }}

用户登录后,检测是不是验证过邮箱,没有则引导去验证

用户登录后,会检测邮箱是不是验证,如果没有验证就会泛起邮箱未验证的提示,并引导用户去验证。效果图以下:

「PHP」laravel 项目实现邮箱验证功能

小我私家网站测试网站截图

实现引导的代码以下:

@if(Auth::check() && !Auth::user()->verified&&!Request::is('email_verification_required')) 
邮箱未激活,请前往 {{ Auth::user()->email }} 查收激活邮件,激活后才能完整地使用社区功能,如发帖和回帖。未收到邮件?请前往 重发邮件
@endif

设置路由,修改 routes 目录下 web.php 文件,增加一个路由,代码以下:

Route::get('/email_verification_required', 'UsersController@emailVerificationRequired')->name('email-verification-required');

接下来为用户节制器定义一个 emailVerificationRequired 要领,该要领将用于用户点击引导链接进入邮件发送页面,页面效果以下:

「PHP」laravel 项目实现邮箱验证功能

小我私家网站测试网站截图

emailVerificationRequired 要领具体实现代码以下:

app/Http/Controllers/UsersController.php

 public function emailVerificationRequired(){ return view('users.edit_email_notify'); }

实现页面代码以下:

resources/views/users/edit_email_notify.blade.php

@extends('layouts.app')@section('title', '发送邮箱验证')@section('content') 

验证邮箱


邮箱未激活,请前往 {{ Auth::user()->email }} 查收激活邮件,激活后才能完整地使用网站功能,如评论、定阅专栏。


未收到邮件?请点击以下按钮重新发送验证邮件。

{!! csrf_field() !!}

@stop

使用阿里云企业邮箱发送邮箱验证链接。

接下来我们要最先使用邮箱发送功能,在 Laravel 中,可以通过 Mail 接口的 send 要领来进行邮件发送,示例以下:

$view = 'emails.email_verification';$data = compact('user');$from = 'aufree@yousails.com';$name = 'Aufree';$to = $user->email;$subject = "谢谢注册 Sample 应用!请确认你的邮箱。";Mail::send($view, $data, function ($message) use ($from, $name, $to, $subject) { $message->from($from, $name)->to($to)->subject($subject);});

Laravel 中邮箱发送的配置寄存于 config/mail.php 中。不过 mail.php 中我们所需的配置,都可以通过 .env 来配置。作为最佳实践,我们优先选择通过环境变量来配置:

.env

MAIL_DRIVER=smtpMAIL_HOST=smtp.mxhichina.comMAIL_PORT=25MAIL_USERNAME=xxxxxxxxxxxxxx@sevdot.comMAIL_PASSWORD=xxxxxxxxxMAIL_ENCRYPTION=tlsMAIL_FROM_ADDRESS=xxxxxxxxxxxxxx@sevdot.comMAIL_FROM_NAME=SevDot

选项 MAIL_USERNAME 和 MAIL_FROM_ADDRESS 需保存一致,为邮箱账号,MAIL_PASSWORD 为邮箱的登录密码。

设置路由,修改 routes 目录下 web.php 文件,增加一个路由,代码以下:

Route::post('/users/send_verification_mail', 'UsersController@sendVerificationMail')->name('users.send-verification-mail');

接下来为用户节制器定义一个 sendVerificationMail 要领,该要领将用于发送邮件给指定用户。具体代码实现以下:

app/Http/Controllers/UsersController.php

 public function sendVerificationMail(){ $user= Auth::user(); $this->sendEmailConfirmationTo($user); session()->flash('success', '验证邮件已发送到您的注册邮箱上,请注意查收。'); return redirect('/'); } protected function sendEmailConfirmationTo($user) { $view = 'emails.email_verification'; $data = compact('user'); $to = $user->email; $subject = "谢谢注册 SevDot,请验证邮箱"; Mail::send($view, $data, function ($message) use ($to, $subject) { $message->to($to)->subject($subject); }); }

在 Laravel 中,我们使用视图来构建邮件模板,在用户查收邮件时,该模板将作为内容展示视图。接下来我们需要建立一个用于渲染注册邮件的 email_verification 视图。

resources/views/emails/email_verification.blade.php

  「PHP」laravel 项目实现邮箱验证功能_互联网点滴

谢谢您在 SevDot 网站进行注册!

请点击下面的链接完成注册: {{ route('verified_email', $user->verification_token) }}

如果这不是您本人的操作,请疏忽此邮件。

到此邮件发送功能已经实现,用户点击发送验证邮箱按钮,就会收到邮件,用户可以进入邮箱,点击邮件链接验证邮箱。

用户点击邮箱验证链接完成验证。

上面我们已经成功发送邮件,用户会收到邮件,用户点击进行验证邮箱,我们继续完成验证邮箱功能。

设置路由,修改 routes 目录下 web.php 文件,增加一个路由,代码以下:

routes/web.php

Route::get('/email_verification/{token}', 'UsersController@verifiedEmail')->name('verified_email');

接下来为用户节制器定义一个 verifiedEmail 要领,该要领将用于验证邮箱。具体代码实现以下:

app/Http/Controllers/UsersController.php

 public function verifiedEmail($token){ $user = User::where('verification_token',$token)->first(); $user->verified = true; $user->verification_token = null; $user->save(); Auth::login($user); session()->flash('success', '恭喜您,邮箱验证成功!'); return redirect('/'); }

至此邮箱验证功能已经悉数完成。


「PHP」laravel 项目实现邮箱验证功能

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)
  • 验证码 点击我更换图片
  • 网友最新评论