豌豆Ai站群搜索引擎系统 V.25.10.25 网址:www.wd.chat

🗣 Wd提问: PHP源码邮件重置密码

🤖 Ai回答:
在 PHP 项目中实现“通过邮件重置密码”功能,通常包含以下几个核心步骤:

1、用户输入邮箱 → 验证邮箱是否存在
2、生成唯一重置令牌(token)并存储到数据库
3、发送包含重置链接的邮件(含 token)
4、用户点击链接 → 跳转到重置密码页面
5、验证 token 有效性 → 允许用户设置新密码

下面是一个完整的、可运行的 PHP 源码示例(使用 MySQL 数据库 + PHPMailer 发送邮件),适用于中小型项目。

✅ 前提条件

已安装 PHP + MySQL
安装了 `PHPMailer`(推荐用 Composer 安装)
数据库表结构:`users` 表包含 `id`, `email`, `password`, `reset_token`, `reset_expires`

📂 文件结构建议

reset-password/
├── index.php 登录/重置密码入口页
├── reset_request.php 处理重置请求(发送邮件)
├── reset_form.php 显示重置密码表单(带 token)
├── reset_process.php 处理密码更新
├── config.php 数据库配置
└── vendor/ Composer 包(PHPMailer)

🔧 1、数据库表结构(MySQL)

sql
CREATE TABLE `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`email` VARCHAR(255) UNIQUE NOT NULL,
`password` VARCHAR(255) NOT NULL,
`reset_token` VARCHAR(64) DEFAULT NULL,
`reset_expires` DATETIME DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

💾 2、config.php(数据库连接)

php
<?php
$host = 'localhost';
$dbname = 'your_db_name';
$username = 'your_db_user';
$password = 'your_db_password';

try {
$pdo = new PDO(mysql:host=$host;dbname=$dbname;charset=utf8mb4, $username, $password);
$pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die(数据库连接失败: 、$e-getMessage());
}
?

📬 3、PHPMailer 邮件发送函数(可选封装)

php
<?php
// mailer.php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Composer 自动加载

function sendResetEmail($to, $token, $base_url) {
$mail = new PHPMailer(true);

try {
// Server settings
$mail-isSMTP();
$mail-Host = 'smtp.gmail.com'; // 或你的 SMTP 服务器
$mail-SMTPAuth = true;
$mail-Username = 'your_email@gmail.com';
$mail-Password = 'app_password'; // Gmail App Password
$mail-SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail-Port = 587;

// Recipients
$mail-setFrom('noreply@yourdomain.com', 'Your Site');
$mail-addAddress($to);

// Content
$mail-isHTML(true);
$mail-Subject = '重置您的密码';
$reset_link = $base_url/reset_form.php?token=$token;
$mail-Body =
<h2重置密码</h2
<p请点击下方链接重置您的密码:</p
<a href='$reset_link' style='background: 007BFF; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;'重置密码</a
<p或复制以下链接到浏览器:</p
<p$reset_link</p
<p<small此链接将在 1 小时后过期。</small</p
;

$mail-send();
return true;
} catch (Exception $e) {
error_log(邮件发送失败: {$mail-ErrorInfo});
return false;
}
}
?

📥 4、reset_request.php —— 处理重置请求

php
<?php
include 'config.php';
include 'mailer.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email']);

if (empty($email)) {
echo json_encode(['status' = 'error', 'message' = '请输入邮箱']);
exit;
}

// 检查邮箱是否存在
$stmt = $pdo-prepare(SELECT id FROM users WHERE email = ?);
$stmt-execute([$email]);
$user = $stmt-fetch();

if (!$user) {
echo json_encode(['status' = 'error', 'message' = '该邮箱未注册']);
exit;
}

// 生成唯一 token
$token = bin2hex(random_bytes(32));
$expires = date('Y-m-d H:i:s', strtotime('+1 hour'));

// 更新数据库
$updateStmt = $pdo-prepare(
UPDATE users SET reset_token = ?, reset_expires = ? WHERE email = ?
);
$updateStmt-execute([$token, $expires, $email]);

// 发送邮件
$baseUrl = $_SERVER['HTTP_HOST'];
$baseUrl = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
$baseUrl .= $baseUrl 、$_SERVER['SERVER_NAME'];

if (sendResetEmail($email, $token, $baseUrl)) {
echo json_encode(['status' = 'success', 'message' = '重置邮件已发送,请查收!']);
} else {
echo json_encode(['status' = 'error', 'message' = '邮件发送失败,请稍后再试']);
}
}
?

🖋️ 5、reset_form.php —— 显示重置密码表单

php
<?php
include 'config.php';

// 获取 token 参数
$token = isset($_GET['token']) ? $_GET['token'] : '';

if (empty($token)) {
die(无效的重置链接);
}

// 验证 token 是否有效
$stmt = $pdo-prepare(
SELECT id, reset_expires FROM users WHERE reset_token = ?
);
$stmt-execute([$token]);
$user = $stmt-fetch();

if (!$user) {
die(重置令牌无效或已过期);
}

$expires = new DateTime($user['reset_expires']);
$now = new DateTime();
if ($now $expires) {
die(重置链接已过期,请重新发起重置请求);
}

// 如果提交表单
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$new_password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];

if (strlen($new_password) < 6) {
$error = 密码至少6位字符;
} elseif ($new_password !== $confirm_password) {
$error = 两次密码不一致;
} else {
// 加密密码(生产环境建议使用 password_hash)
$hashed_password = password_hash($new_password, PASSWORD_DEFAULT);

// 更新密码并清除 token
$updateStmt = $pdo-prepare(
UPDATE users SET password = ?, reset_token = NULL, reset_expires = NULL WHERE reset_token = ?
);
if ($updateStmt-execute([$hashed_password, $token])) {
echo <h2密码重置成功!</h2<p<a href='index.php'返回登录页</a</p;
exit;
} else {
$error = 系统错误,请重试;
}
}
}
?

<!DOCTYPE html
<html
<head
<title重置密码</title
</head
<body
<h2重置密码</h2
<?php if (isset($error)): ?
<p style=color:red;<?php echo htmlspecialchars($error); ?</p
<?php endif; ?

<form method=post
<label新密码:<input type=password name=password required</label<br<br
<label确认密码:<input type=password name=confirm_password required</label<br<br
<button type=submit重置密码</button
</form

<p<small链接有效期 1 小时</small</p
</body
</html

🔄 6、reset_process.php(可选,用于 API 接口处理)

如果你希望将重置逻辑作为 API 接口,可以单独写一个 `reset_process.php`,接收 POST 请求并验证 token,然后更新密码。

🛡️ 安全建议

使用 `password_hash()` 存储密码
Token 使用强随机字符串(`random_bytes`)
Token 过期时间设为 1 小时
防止暴力破解:限制每 IP 每天最多重置次数
HTTPS 必须启用(防止中间人窃取 token)

🚀 如何部署?

1.

Ai作答

📣 商家广告


算命

八字

vps

中国域名

广告招商


0

IP地址: 222.243.41.241

搜索次数: 39

提问时间: 2025-11-21 20:05:58

🛒 域名购买

❓️ 热门提问

🌐 域名评估

最新挖掘

🖌 热门作画

🤝 关于我们

🗨 加入群聊

🔗 友情链接

🧰 站长工具
📢

温馨提示

本站所有 问答 均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。

👉

技术支持

本站由 🟢 豌豆Ai 提供技术支持,使用的最新版: 豌豆Ai站群搜索引擎系统 V.25.10.25 搭建本站。

上一篇 86613 86614 86615 下一篇