laravel中自定义邮件发送重置密码 - 小众知识

laravel中自定义邮件发送重置密码

2020-08-18 16:26:53 苏内容
  标签: laravel/邮件
阅读:4876

供自己或有需要的朋友查询参考。如有错误请帮忙指明,谢谢

作为一个laravel新人,想做一个重置密码邮件发送,然而官方文档中是使用php artisan make:auth 生成的模板,网上众多博客我这个小白又看得似懂非懂的,因此还是自己写一篇自己看得懂的吧。

 

laravel已经将重置密码、跟邮件发送逻辑封装好了(就是app\Http\Controller\Auth下的ForgotPasswordController、ResetPasswordController),我们直接拿来用就好。需要改的仅是自定义模板。

 

一、配置SMTP

在这我们使用SMTP驱动作为我们发送邮件的协议。我们需配置.env文件。

  1. //在.env文件中找到这一段
  2. MAIL_DRIVER=smtp                          //默认即为smtp
  3. MAIL_HOST=smtp.qq.com                     //使用什么邮箱即为smtp.xx.com
  4. MAIL_PORT=25                              //默认为2525,改为25
  5. MAIL_USERNAME=1260854258@qq.com           //你的邮箱
  6. MAIL_PASSWORD=hjskhgtjgvaigcce            //从邮箱设置那边获取的POP3/SMTP服务的授权码
  7. MAIL_ENCRYPTION=null
  8. MAIL_FROM_ADDRESS=1260854258@qq.com       //必须与上面的USERNAME一致

二、发送重置密码邮件

1.我们使用 php artisan make:notification ResetPassword 命令创建一个通知。命令会自动在 app\Notifications 下生成一个ResetPassword 的文件,文件内容也自动生成好了。内有__construct、via、toMail、toArray这几个函数,我们等下需要使用修改toMail函数。

2.需要在User.php模型中重写sendPasswordResetNotification方法。下面是我的代码,供参考

  1. <?php
  2. namespace App;
  3. use Illuminate\Notifications\Notifiable;
  4. use Illuminate\Foundation\Auth\User as Authenticatable;
  5. use App\Notifications\ResetPassword as ResetPasswordNotification;
  6. use Illuminate\Auth\Passwords\CanResetPassword;
  7. class User extends Authenticatable
  8. {
  9. use Notifiable;
  10. use CanResetPassword;
  11. 。。。
  12. //省略了一些其他的代码
  13. public function sendPasswordResetNotification($token)
  14. {
  15. $this->notify(new ResetPasswordNotification($token));
  16. }
  17. }

3.发送邮件逻辑

发送邮件的模板这就不写了,只需要一个表单,让用户输入邮箱即可。

邮件发送的地址中带有token可能有些新手跟我一样也不懂是什么,我在这简单说明下。token不是User表中用于SCFR保护的remember_token字段,而是password_resets表中的token字段。我们使用createToken函数时框架会自动生成的。

下面是我的代码,供参考

  1. use App\User;
  2. use \Illuminate\Auth\Passwords\PasswordBroker;
  3. use App\Http\Controllers\Auth\ResetPasswordController;
  4. class AuthController extends Controller{
  5. ....
  6. //省略其余代码
  7. //发送重置密码邮件
  8. public function ResetEmail(Request $request){
  9. $user = User::where('email', $request->email)->first();
  10. //实例化一个PasswordBroker类
  11. //发邮件实际使用的是sendResetLink函数,该函数就在PasswordBroker里
  12. $password_broker = app(PasswordBroker::class);
  13. //生成token
  14. $token = $password_broker->createToken($user);
  15. //调用User模型中的sendPasswordResetNotification方法发送邮件
  16. $user->sendPasswordResetNotification($token);
  17. }
  18. }

4、邮件样式

我觉得默认的样式挺不错的就没换了,样式也可以直接使用自己的模板。如果使用默认模板,我们需要将英文翻译成中文,这样才符合中国人的阅读。

我们对在步骤2.1生成的ResetPassword 里的toMail函数进行更改。下面是我的代码,供参考

  1. /**
  2. *from定义的是发件人名称
  3. *subject定义的是邮件标题
  4. */
  5. public function toMail($notifiable)
  6. {
  7. return (new MailMessage)
  8. ->from('1260854258@qq.com', 'xxx')
  9. ->subject('重置密码')
  10. ->line('您收到此电子邮件是因为我们收到了您帐户的密码重置请求.')
  11. ->action('重置密码', url('password/reset', $this->token))
  12. ->line('如果您未请求重置密码,则无需采取进一步措施.');
  13. }

然后在.env中修改APP_NAME的值,可将“Laravel“修改为自己的网站名。

三、重置密码

1.从邮件链接进入的重置密码页面模板

模板表单中必须有隐藏的token输入框,值为传入的token。

例:

<input type="hidden" name="token" value="{{$token}}">

模板表单中必须有用户邮箱

例:

<input  type="email" name="email" value="{{ old('email') }}" placeholder="请输入邮箱">

如果没有这两个会报函数的参数1错误。

2.重置密码逻辑

可以直接使用Illuminate\Foundation\Auth\ResetsPasswords中的reset函数。下面是我的代码,供参考

  1. use App\Http\Controllers\Auth\ResetPasswordController;
  2. class AuthController extends Controller{
  3. 。。。
  4. //省略其他代码
  5. //重置密码逻辑
  6. public function reseting(Request $request){
  7. $passreset = app(ResetPasswordController::class);
  8. $passreset->reset($request);
  9. }

这是我的路由

  1. //填写重置密码邮箱页面
  2. Route::get('/reset','Home\AuthController@reset');
  3. //发送重置密码邮件
  4. Route::post('/resetemail','Home\AuthController@ResetEmail');
  5. //重置密码页
  6. Route::get('/password/reset/{token}','Home\AuthController@passwordreset');
  7. //重置密码逻辑
  8. Route::post('/password/reset','Home\AuthController@reseting');

 


扩展阅读
相关阅读
© CopyRight 2010-2021, PREDREAM.ORG, Inc.All Rights Reserved. 京ICP备13045924号-1