php laravel 忘记密码,laravel 用户发送邮件重置密码

laravel5.3 重置密码

由于重置密码需要发送邮件,而laravel默认使用国外的驱动,所以需要改成国内的驱动,使用sendcloud

第一步:忘记密码

首先看到的是App\Http\Controllers\Auth\ForgotPasswordController.php的代码

use SendsPasswordResetEmails; //使用这个trait显示发送邮件,和发送邮件

/**

* Create a new controller instance.

*

* @return void

*/

public function __construct()

{

$this->middleware('guest');

}

看到是如此干净,看来只有可能在SendsPasswordResetEmails

第二部:发送邮件

再上一步我们知道,用到了一个SendsPasswordResetEmails trait,里面有两个重要的方法:

//显示视图

public function showLinkRequestForm()

{

return view('auth.passwords.email');

}

public function sendResetLinkEmail(Request $request)

{

//验证邮箱地址是否有效

$this->validate($request, ['email' => 'required|email']);

//发送邮件 sendResetLink是PasswordBroker 里面的一个方法

$response = $this->broker()->sendResetLink(

$request->only('email')

);

//根据发送邮件返回状态 返回相应

return $response == Password::RESET_LINK_SENT

? $this->sendResetLinkResponse($response)

: $this->sendResetLinkFailedResponse($request, $response);

}

/**

* Get the broker to be used during password reset.

*

* @return \Illuminate\Contracts\Auth\PasswordBroker 看这个返回值

*/

public function broker()

{

return Password::broker();

}

可以看到\Illuminate\Contracts\Auth\PasswordBroker这个接口实例是Illuminate\Auth\PasswordsPasswordBroker.php这个文件,找到上面发送邮件使用的一个方法sendResetLink,如下

public function sendResetLink(array $credentials)

{

//查找用户信息

$user = $this->getUser($credentials);

if (is_null($user)) {

return static::INVALID_USER;

}

//真正发送邮件的地方,发现调用的User.php 里的方法

$user->sendPasswordResetNotification(

$this->tokens->create($user)

);

return static::RESET_LINK_SENT;

}

第三步:用户数据模型

上一步看到发送邮件使用的是User.php这个model 里的 sendPasswordResetNotification方法

1460000009192709

发现并没有这个方法,看到继承Authenticatable,进去看看:

1460000009192710?w=813&h=615

发现了重大新闻,这个地方用了个trait CanResetPassword,看下代码:

//找到第二步中调用的方法了

public function sendPasswordResetNotification($token)

{

$this->notify(new ResetPasswordNotification($token));//notify 又是什么鬼,暂时没有注意到

}

看下ResetPasswordNotification,发现有个发送邮件的方法:

1460000009192711?w=974&h=315

public function toMail($notifiable)

{

return (new MailMessage)

->line('You are receiving this email because we received a password reset request for your account.')

->action('Reset Password', url('password/reset', $this->token))

->line('If you did not request a password reset, no further action is required.');

}

// url('password/reset', $this->token)) 这个重写的时候用的上

这样看来,我们重现一下User.php中的这个方法就应该可以改写laravel默认发送邮件的方式了

public function sendPasswordResetNotification($token)

{

// 模板变量

$data = [

'url' => url('password/reset', $token), //这个地址是Illuminate\Auth\Notifications\ResetPassword 中方法toMail 里的url,复制过来就可以

'name'=>$this->name,

];

$template = new SendCloudTemplate( 'zhihu_app_register', $data );

Mail::raw( $template, function ( $message ) {

$message->from( 'xxxx@qq.com', 'xxxx' );

$message->to( $this->email );

} );

}

}

这样我们就改了默认重置密码发送邮件的方法了

还有很多细节,等有空再去细抠,weaving love

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤实现laravel6通过邮箱验证码实现忘记密码的功能: 1. 创建忘记密码页面和发送邮件页面,包括输入框和发送按钮。 2. 创建路由: ```php Route::get('forgot-password', 'ForgotPasswordController@showLinkRequestForm')->name('password.request'); Route::post('forgot-password', 'ForgotPasswordController@sendResetLinkEmail')->name('password.email'); ``` 3. 创建控制器: ```php php artisan make:controller ForgotPasswordController ``` 4. 在控制器中编写 showLinkRequestForm 方法和 sendResetLinkEmail 方法。 ```php public function showLinkRequestForm() { return view('auth.passwords.email'); } public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); $user = User::where('email', $request->email)->first(); if (!$user) { return redirect()->back()->withErrors(['email' => '该邮箱未注册']); } $token = str_random(64); DB::table('password_resets')->insert([ 'email' => $request->email, 'token' => $token, 'created_at' => Carbon::now() ]); Mail::to($request->email)->send(new ResetPassword($token)); return redirect()->back()->with('success', '重置密码邮件已发送,请注意查收'); } protected function validateEmail(Request $request) { $request->validate(['email' => 'required|email']); } ``` 5. 创建邮件模板: ```php php artisan make:mail ResetPassword --markdown=emails.reset_password ``` 6. 在邮件模板中编写重置密码邮件的内容: ```php @component('mail::message') # 重置密码 请点击以下按钮重置密码: @component('mail::button', ['url' => route('password.reset', ['token' => $token])]) 重置密码 @endcomponent 如果您没有请求重置密码,请忽略此邮件。 Thanks,<br> {{ config('app.name') }} @endcomponent ``` 7. 在 .env 文件中配置邮箱信息: ```php MAIL_DRIVER=smtp MAIL_HOST=smtp.qq.com MAIL_PORT=465 MAIL_USERNAME=youremail@qq.com MAIL_PASSWORD=yourpassword MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=youremail@qq.com MAIL_FROM_NAME="${APP_NAME}" ``` 8. 运行应用并测试重置密码功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值