百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

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

citgpt 2024-09-26 11:29 6 浏览 0 评论

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

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

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

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

<?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;
}
?>

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

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

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

<button type="button" name="sendCaptcha" class="btn btn-primary" onclick="CheckEmail()">发送验证码</button>

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

    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中使用了用户会话的方式储存验证码:

// 启动会话
session_start();
$_SESSION['captcha'] = $captcha; // 将验证码保存到本地会话中

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

// 启动会话
session_start();

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

$userCaptcha = $_POST['captcha']; // 用户输入的验证码

然后使用

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

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

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

最近我已经开发好了如何动态加载数据库中的发件人信息,也就是说,发件人的所有信息都可以保存到数据库,然后通过调用数据库进行加载,省去了修改代码的功夫。

如果你对网页开发感兴趣,可以关注我!

整理不易,还望支持!

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: