邮件扩展
1.在app目录下创建common.php文件(公共文件)
2.下载邮件扩展
composer require phpmailer/phpmailer
3.在common.php文件中编写发送邮件函数
<?php
namespace App;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function mailto($to,$title,$content)
{
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//服务器配置
$mail->CharSet ="UTF-8"; //设定邮件编码
$mail->SMTPDebug = 0; // 调试模式输出
$mail->isSMTP(); // 使用SMTP
$mail->Host = 'smtp.qq.com'; // SMTP服务器
$mail->SMTPAuth = true; // 允许 SMTP 认证
$mail->Username = '1297611128@qq.com'; // SMTP 用户名 即邮箱的用户名
$mail->Password = 'cqrxusqyehxkgfhc'; // SMTP 密码 部分邮箱是授权码(例如163邮箱)
$mail->SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议
$mail->Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持
$mail->setFrom('1297611128@qq.com','黄昌龙'); //发件人
$mail->addAddress($to); // 收件人
$mail->isHTML(true); // 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容
$mail->Subject = $title;
$mail->Body = $content;
return $mail->send(); //返回发送得到结果
} catch (Exception $e) {
exception($mail->ErrorInfo);
}
}
4.在composer.json中添加以下代码,并执行composer dump-autoload命令
忘记密码
1.创建forget方法和reset方法路由
代码如下
Route::group(['prefix'=>'admin','namespace'=>'Admin'],function (){
//登录
Route::match(['get','post'],'/','Index@login');
//注册
Route::match(['get','post'],'register','Index@register');
//忘记密码
Route::match(['get','post'],'forget','Index@forget');
//重置密码
Route::match(['get','post'],'reset','Index@reset');
});
2.引入HTML模板
forget.blade.php主要代码如下:
<form>
<div class="loginbox-title">忘记密码</div>
<div class="loginbox-or">
<div class="or-line"></div>
</div>
<div class="loginbox-textbox">
<input type="text" class="form-control" name="username" placeholder="请输入用户名" />
</div>
<div class="loginbox-textbox">
<input type="text" class="form-control" name="email" placeholder="请输入邮箱" />
</div>
<div class="loginbox-submit">
<input type="submit" id="sendCode" class="btn btn-primary btn-block" value="发送验证码">
</div>
<div class="loginbox-signup">
<a href="{{url('admin')}}">返回登录</a>
</div>
</form>
3.通过jquery的ajax提交数据给Index控制器中的forget方法
代码如下:
$(function () {
$('#sendCode').click(function () {
$.ajax({
url:"{{url('admin/forget')}}",
type:'post',
data:$('form').serialize(),
dataType:'json',
success:function (data) {
if (data.code==1){
layer.msg(data.msg,{
icon:6,
time:2000,
},function () {
location.href=data.url;
});
}else{
layer.open({
title:"发送失败",
content:data.msg,
icon:5,
anim:6
})
}
}
});
return false;
});
});
4.编写Index控制器中forget方法,并接受前端传过来的数据,处理后将其传到Admin模型的forget方法处理
代码如下:
//忘记密码
public function forget()
{
if (request()->isMethod('post')){
$data=request()->only(['username','email']);
$result=(new Admin())->forget($data);
if ($result==1){
$msg=[
'code'=>1,
'msg'=>"验证码发送成功",
'url'=>url('admin/reset'),
];
}else{
$msg=[
'code'=>0,
'msg'=>$result,
];
}
return $msg;
}
return view('admin.index.forget');
}
5.编写Admin模型中forget代码,处理控制器传过来的数据,创建验证器,对数据进行验证,利用session存储验证码和用户名。
public function forget($data){
$rule=[
'username'=>'bail|required',
'email'=>'required',
];
$msg=[
'username.required'=>'用户名不能为空',
'email.required'=>'邮箱不能为空',
];
$validator=Validator::make($data,$rule,$msg);
if ($validator->fails()){
return $validator->errors()->first();
}
$adminData=$this->where($data)->first();
if ($adminData){
$code=rand(1000,9999);//产生随机验证码
$result=mailto($adminData['email'],'您的重置密码验证码',$code);
if ($result){
session(['code'=>$code]);
session(['email'=>$adminData['email']]);
return 1;
}
}else{
return "用户名或邮箱错误";
}
}
重置密码
1.引入HTML文件reset.blade.php
<form>
<div class="loginbox-title">重置密码</div>
<div class="loginbox-or">
<div class="or-line"></div>
</div>
<div class="loginbox-textbox">
<input type="text" class="form-control" name="newpassword" placeholder="请输入新密码" />
</div>
<div class="loginbox-textbox">
<input type="text" class="form-control" name="code" placeholder="请输入验证码" />
</div>
<div class="loginbox-submit">
<input type="submit" id="reset" class="btn btn-primary btn-block" value="重置密码">
</div>
<div class="loginbox-signup">
<a href="{{url('admin')}}">返回登录</a>
</div>
</form>
2.用过jquery的ajax将新密码和验证码提交给Index控制器的reset方法处理
代码如下:
$(function () {
$('#reset').click(function () {
$.ajax({
url:"{{url('admin/reset')}}",
type:'post',
data:$('form').serialize(),
dataType:'json',
success:function (data) {
if (data.code==1){
layer.msg(data.msg,{
icon:6,
time:2000,
},function () {
location.href=data.url;
});
}else{
layer.open({
title:"密码重置失败",
content:data.msg,
icon:5,
anim:6
})
}
}
});
return false;
});
});
3.编写Index控制器中reset方法,接收新密码和验证码,并传给Admin模型的reset方法处理
代码如下:
public function reset()
{
if (request()->isMethod('post')){
$data=request()->only(['newpassword','code']);
$result=(new Admin())->reset($data);
if ($result==1){
$msg=[
'code'=>1,
'msg'=>'重置密码成功',
'url'=>url('admin')
];
}else{
$msg=[
'code'=>0,
'msg'=>$result
];
}
return $msg;
}
return view('admin.index.reset');
}
4.编写Admin模型中reset方法,创建验证器验证数据
代码如下:
//重置密码
public function reset($data)
{
$rule=[
'newpassword'=>'bail|required',
'code'=>'required',
];
$msg=[
'newpassword'=>'新密码不能为空',
'code.required'=>'验证码不能为空',
];
$validator=Validator::make($data,$rule,$msg);
if ($validator->fails()){
return $validator->errors()->first();
}
if (session('code')==$data['code'])
{
$adminData=$this->where('email',session('email'))->first();
$adminData->password=$data['newpassword'];
$result=$adminData->save();
if ($result){
return 1;
}else{
return "密码重置失败";
}
}else{
return '验证码错误';
}
}
效果图如下: