前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP使用PHPMailer发送验证码邮件的方法与调用逻辑

PHP使用PHPMailer发送验证码邮件的方法与调用逻辑

原创
作者头像
半夜喝可乐
发布2023-09-20 11:53:39
4130
发布2023-09-20 11:53:39
举报
文章被收录于专栏:小轻论坛小轻论坛

首先我们需要下载PHPMailer:https://github.com/PHPMailer/PHPMailer

一般情况下我们只需要压缩包中的src文件夹中的文件,并保存至根目录即可:

设置一个文件,如tomail.php:

代码语言:javascript
复制
<?php
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';
require 'PHPMailer/Exception.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once 'config.php';

// 启动会话
session_start();

// 发送邮件
function sendEmail($to, $subject, $body) {
    $mail = new PHPMailer(true);

    try {
        // 配置SMTP服务器
        $mail->isSMTP();
        $mail->Host = ''; // 邮件服务器主机名
        $mail->SMTPAuth = true;
        $mail->Username = ''; // 邮件服务器用户名
        $mail->Password = ''; // 邮件服务器密码
        $mail->SMTPSecure = 'tls'; // 使用加密连接
        $mail->Port = 587;

        // 设置发件人和收件人
        $mail->setFrom('', '');  // 设置发件人邮箱和名称
        $mail->addAddress($to);  // 设置收件人邮箱

        // 设置邮件内容
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body = $body;

        // 发送邮件
        $mail->send();
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// 获取页面传递的数据
$email = $_POST['email'];  // 假设页面通过POST方式传递了email参数
$action = $_POST['sendCaptcha'];  // 假设页面通过POST方式传递了sendCaptcha参数

// 根据逻辑发送邮件或输出错误消息
if ($action === 'reg' || $action === 'reset') {
    // 检查邮箱是否已存在
    $query = "SELECT * FROM users WHERE email = '$email'";
    $result = mysqli_query($conn, $query);

    if (mysqli_num_rows($result) > 0) {
        if ($action === 'reg') {
            echo '邮箱已存在';
        } else {
            $captcha = getCaptcha();
            $subject = '密码重置验证码';
            $body = '您的验证码是:' . $captcha;
            if (sendEmail($email, $subject, $body)) {
                echo '验证码已发送至您的邮箱';
                $_SESSION['captcha'] = $captcha; // 将验证码保存到本地会话中
            } else {
                echo '发送邮件失败';
            }
        }
    } else {
        if ($action === 'reg') {
            $captcha = getCaptcha();
            $subject = '注册验证码';
            $body = '您的验证码是:' . $captcha;
            if (sendEmail($email, $subject, $body)) {
                echo '验证码已发送至您的邮箱';
                $_SESSION['captcha'] = $captcha; // 将验证码保存到本地会话中
            } else {
                echo '发送邮件失败';
            }
        } else {
            echo '该邮箱未注册';
        }
    }
}

function getCaptcha() {
    $length = 6; // 验证码长度
    $charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 验证码字符集
    $captcha = "";

    for ($i = 0; $i < $length; $i++) {
        $randomIndex = mt_rand(0, strlen($charset) - 1);
        $captcha .= $charset[$randomIndex];
    }

    return $captcha;
}
?>

对于注册和修改密码,我在这个文件中设置了一个判断,能够检测到是哪个页面返回的数据,从而判断邮箱是否注册,注册了就可以修改密码,不能重新注册,进而发送验证码。

其中我们使用的是腾讯企业邮箱,腾讯企业邮箱不容易被封禁,具体注册步骤请看注册/开通腾讯企业邮箱流程-帮助中心-企业微信,这里就不过多赘述。

在相应的注册和修改密码页面,我使用了一个同样的发送验证码的按钮:

代码语言:javascript
复制
<button type="button" name="sendCaptcha" class="btn btn-primary" onclick="CheckEmail()">发送验证码</button>

然后使用js事件调用这个tomail.php文件:

代码语言:javascript
复制
    var isSending = false; // 标记是否正在发送验证码
    var countdown = 60; // 倒计时秒数

    function sendEmail() {
        // 如果正在发送验证码,则直接返回
        if (isSending) {
            return;
        }

        // 获取邮箱输入框的值
        var email = document.getElementById('email').value;

        // 创建一个新的表单数据对象
        var formData = new FormData();
        formData.append('email', email);
        formData.append('sendCaptcha', 'reg/reset');

        // 创建一个新的XMLHttpRequest对象
        var xhr = new XMLHttpRequest();

        // 配置POST请求
        xhr.open('POST', 'tomail.php', true);

        // 发送请求
        xhr.send(formData);

        // 处理响应
        xhr.onreadystatechange = function() {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    // 请求成功
                    console.log(xhr.responseText);
                    startCountdown(); // 开始倒计时
                } else {
                    // 请求失败
                    console.log('请求失败');
                }
            }
        };
    }

需要注意的是,上面formData.append('sendCaptcha','reg/reset');中有一个reg和reset参数,这是为了传递给tomail.php识别的,如果是注册页面就是用reg,如果是修改密码页面就用reset,自行修改即可。

这样你就能收到相应的验证码邮件了!

注册邮件
注册邮件
修改密码邮件
修改密码邮件

系统如何校验验证码的呢?

眼尖的人也发现了我在tomail.php中使用了用户会话的方式储存验证码:

代码语言:javascript
复制
// 启动会话
session_start();
$_SESSION['captcha'] = $captcha; // 将验证码保存到本地会话中

所以我们也需要在相应页面加载会话:

代码语言:javascript
复制
// 启动会话
session_start();

我们首先要获取用户输入的验证码,并传递给后端:

代码语言:javascript
复制
$userCaptcha = $_POST['captcha']; // 用户输入的验证码

然后使用

代码语言:javascript
复制
 if ($_SESSION['captcha'] === $userCaptcha) {
     //修改密码或者注册用户的相关逻辑
 }

这样就能完美将邮件后端生成的验证码和用户输入的验证码进行校验了。

是不是很简单,赶紧试试吧!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档