Laravel博客系统开发--邮件操作(忘记/重置密码)

本文详细介绍了一种基于PHP的邮箱验证及密码重置流程,包括邮件扩展的安装与使用,以及前端页面设计与后端逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

邮件扩展

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 '验证码错误';
        }
    }

效果图如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值