http://www.c4dcn.com

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

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

很多网站都用邮件验证,包括我的个人网站。邮件验证需要邮件发送服务,Laravel提供了一个非常简单的邮件发送API。Laravel项目实现邮件发送功能非常简单。现在我来介绍一下我的具体实现。

邮箱验证

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

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

使用命令生成迁移文件。该命令如下所示:

$phpartisanmake:migrationadd_verification_to_users_table--table=users

命令将在数据库/迁移目录中生成迁移文件[时间戳]_添加_验证_至_用户_table.php,并按如下方式修改迁移文件:

useIlluminateSupportFacadesSchema;useIlluminateDatabaseSchemaBlueprint;useIlluminateDatabaseMigrationsMigration;classAddVerificationToUsersTableextendsMigration{/***Runthemigrations.**@returnvoid*/publicfunctionup(){Schema::table('users',function(Blueprint$table){$table->string('verification_token')->nullable();$table->boolean('verified')->default(false);});}/***Reversethemigrations.**@returnvoid*/publicfunctiondown(){Schema::table('users',function(Blueprint$table){$table->dropColumn('verification_token');$table->dropColumn('verified');});}

然后,我运行迁移,并将字段添加到用户表中。按如下方式运行命令:

phpartisanmigrate生成令牌

我想在用户注册时为他们生成令牌,所以我在App目录中创建了Observers目录,在Observers目录中创建了UserObserver.php文件,并编写了以下代码:

namespaceAppObservers;useAppModelsArticle;useAppModelsComment;useAppModelsReply;useAppModelsUser;classUserObserver{publicfunctioncreating(User$user){$user->verification_token=str_random(30);}}

用下面的代码在app/Providers目录下的AppServiceProvider.php文件中注册并收听雄辩事件:

namespaceAppProviders;useIlluminateSupportServiceProvider;classAppServiceProviderextendsServiceProvider{/***Bootstrapanyapplicationservices.**@returnvoid*/publicfunctionboot(){AppModelsUser::observe(AppObserversUserObserver::class);}/***Registeranyapplicationservices.**@returnvoid*/publicfunctionregister(){//}}用户登录后,检测是否验证过邮箱,没有则引导去验证

登录后,用户将检查邮箱是否经过验证。如果未验证,会出现邮箱未验证的提示,引导用户验证。效果图如下:

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

个人网站测试网站截图

实现的代码如下:

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

设置路由,修改routes目录中的web.php文件,并使用以下代码添加一个路由:

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

接下来,为用户控制器定义一个emailVerificationRequired方法,该方法将用于用户点击向导链接进入邮件发送页面。页面效果如下:

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

个人网站测试网站截图

emailVerificationRequired方法的具体实现代码如下:

app/Http/Controllers/userscontroller.PHP

publicfunctionemailVerificationRequired(){returnview('users.edit_email_notify');}

实现页面代码如下:

资源/视图/用户/edit_email_notify.blade.php

@extends('layouts.app')@section('title','发送邮箱验证')@section('content')<section><div><div><div><div><div><h2><iaria-hidden="true"></i>验证邮箱</h2><hr><article><div><p>邮箱未激活,请前往{{Auth::user()->email}}查收激活邮件,激活后才能完整地使用网站功能,如评论、订阅专栏。</p><br><p>未收到邮件?请点击以下按钮重新发送验证邮件。</p></div></article><formmethod="POST"action="{{route('users.send-verification-mail')}}"accept-charset="UTF-8">{!!csrf_field()!!}<div><button><iaria-hidden="true"></i>重新发送验证邮件</button></div><br></form></div></div></div></div></div></section>@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需要的所有配置都可以通过。环境。作为最佳实践,我们更喜欢通过环境变量进行配置:

。包封/包围(动词envelop的简写)

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

publicfunctionsendVerificationMail(){$user=Auth::user();$this->sendEmailConfirmationTo($user);session()->flash('success','验证邮件已发送到您的注册邮箱上,请注意查收。');returnredirect('/');}protectedfunctionsendEmailConfirmationTo($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视图来呈现注册邮件。

资源/视图/电子邮件/email_verification.blade.php

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>注册确认链接</title></head><body><h1>感谢您在SevDot网站进行注册!</h1><p>请点击下面的链接完成注册:<ahref="{{route('verified_email',$user->verification_token)}}">{{route('verified_email',$user->verification_token)}}</a></p><p>如果这不是您本人的操作,请忽略此邮件。</p></body></html>

这个邮件发送功能已经实现。用户可以单击发送验证电子邮件按钮来接收电子邮件。用户可以输入电子邮件并单击电子邮件链接来验证电子邮件。

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

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

设置路由,修改routes目录中的web.php文件,并使用以下代码添加一条路由:

routes/web.php

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

接下来,为用户控制器定义一个verifiedEmail方法,该方法将用于验证邮箱。具体代码实现如下:

app/Http/Controllers/userscontroller.PHP

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

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


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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。