供自己或有需要的朋友查询参考。如有错误请帮忙指明,谢谢
作为一个laravel新人,想做一个重置密码邮件发送,然而官方文档中是使用php artisan make:auth 生成的模板,网上众多博客我这个小白又看得似懂非懂的,因此还是自己写一篇自己看得懂的吧。
laravel已经将重置密码、跟邮件发送逻辑封装好了(就是app\Http\Controller\Auth下的ForgotPasswordController、ResetPasswordController),我们直接拿来用就好。需要改的仅是自定义模板。
一、配置SMTP
在这我们使用SMTP驱动作为我们发送邮件的协议。我们需配置.env文件。
MAIL_DRIVER=smtp //默认即为smtp
MAIL_HOST=smtp.qq.com //使用什么邮箱即为smtp.xx.com
MAIL_PORT=25 //默认为2525,改为25
MAIL_USERNAME=1260854258@qq.com //你的邮箱
MAIL_PASSWORD=hjskhgtjgvaigcce //从邮箱设置那边获取的POP3/SMTP服务的授权码
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方法。下面是我的代码,供参考
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Notifications\ResetPassword as ResetPasswordNotification;
use Illuminate\Auth\Passwords\CanResetPassword;
class User extends Authenticatable
public function sendPasswordResetNotification($token)
$this->notify(new ResetPasswordNotification($token));
3.发送邮件逻辑
发送邮件的模板这就不写了,只需要一个表单,让用户输入邮箱即可。
邮件发送的地址中带有token可能有些新手跟我一样也不懂是什么,我在这简单说明下。token不是User表中用于SCFR保护的remember_token字段,而是password_resets表中的token字段。我们使用createToken函数时框架会自动生成的。
下面是我的代码,供参考
use \Illuminate\Auth\Passwords\PasswordBroker;
use App\Http\Controllers\Auth\ResetPasswordController;
class AuthController extends Controller{
public function ResetEmail(Request $request){
$user = User::where('email', $request->email)->first();
//发邮件实际使用的是sendResetLink函数,该函数就在PasswordBroker里
$password_broker = app(PasswordBroker::class);
$token = $password_broker->createToken($user);
//调用User模型中的sendPasswordResetNotification方法发送邮件
$user->sendPasswordResetNotification($token);
4、邮件样式
我觉得默认的样式挺不错的就没换了,样式也可以直接使用自己的模板。如果使用默认模板,我们需要将英文翻译成中文,这样才符合中国人的阅读。
我们对在步骤2.1生成的ResetPassword 里的toMail函数进行更改。下面是我的代码,供参考
public function toMail($notifiable)
->from('1260854258@qq.com', 'xxx')
->line('您收到此电子邮件是因为我们收到了您帐户的密码重置请求.')
->action('重置密码', url('password/reset', $this->token))
->line('如果您未请求重置密码,则无需采取进一步措施.');
然后在.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函数。下面是我的代码,供参考
use App\Http\Controllers\Auth\ResetPasswordController;
class AuthController extends Controller{
public function reseting(Request $request){
$passreset = app(ResetPasswordController::class);
$passreset->reset($request);
这是我的路由
Route::get('/reset','Home\AuthController@reset');
Route::post('/resetemail','Home\AuthController@ResetEmail');
Route::get('/password/reset/{token}','Home\AuthController@passwordreset');
Route::post('/password/reset','Home\AuthController@reseting');