基于腾讯云开发(Tencent Cloud Base)实现小程序邮箱验证找回密码功能的完整逻辑说明及关键代码实现。结合安全性和开发效率,方案采用 云函数 + 小程序前端 的架构,使用 Nodemailer 发送邮件。Nodemailer 是一个专为 Node.js 设计的开源邮件发送库,用于在服务端高效、灵活地处理电子邮件发送任务。它通过简化邮件传输协议(如 SMTP)的复杂性,为开发者提供了强大的邮件管理能力。
一、实现原理
用“快递站”比喻来解释这个流程:
快递站代发包裹(系统统一发验证码)
公司搭了个快递站(系统邮箱),专门代发验证码“包裹”。用户填个收件地址(邮箱),站长立刻打包发出📮。用户只管收件(注册流程)
用户啥也不用干,留完地址就坐等收件。拆开包裹填个验证码,立马进门(完成验证)✅。站长领把钥匙(管理员配一次)
给快递站申请个专属钥匙(获取QQ邮箱授权码)🔑;把钥匙存进公司保险柜(更新数据库)。 从此站长随时能开门发件,永不失效!
二、功能逻辑流程图如下所示:
三、JavaScript代码
Page({
data: {
account: '',
email: '',
code: '',
newPassword: ''
},
// 输入绑定
onAccountInput(e) { this.setData({ account: e.detail.value }); },
onEmailInput(e) { this.setData({ email: e.detail.value }); },
onCodeInput(e) { this.setData({ code: e.detail.value }); },
onPwdInput(e) { this.setData({ newPassword: e.detail.value }); },
// 发送验证码
async sendCode() {
const { account, email } = this.data;
try {
const res = await wx.cloud.callFunction({
name: 'sendEmailCode',
data: { account, email }
});
wx.showToast({ title: '验证码已发送至邮箱' });
} catch (err) {
wx.showToast({ title: '发送失败', icon: 'error' });
}
},
// 重置密码
async resetPassword() {
const { account, email, code, newPassword } = this.data;
try {
await wx.cloud.callFunction({
name: 'verifyCodeAndReset',
data: { account, email, code, newPassword }
});
wx.showToast({ title: '密码重置成功' });
} catch (err) {
wx.showToast({ title: '验证码错误或已过期', icon: 'error' });
}
}
});
四、云函数实现(Node.js)
1. 发送验证码云函数 (sendEmailCode
)
const cloud = require('wx-server-sdk');
const nodemailer = require('nodemailer');
cloud.init();
// 配置QQ邮箱(需开启SMTP并获取授权码)
const transporter = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 465,
secure: true,
auth: {
user: 'your_email@qq.com', // 发件邮箱
pass: 'your_authorization_code' // QQ邮箱授权码
}
});
exports.main = async (event) => {
const { account, email } = event;
const db = cloud.database();
// 校验账号和邮箱是否匹配
const user = await db.collection('users').where({
account,
email
}).get();
if (user.data.length === 0) {
throw new Error('账号或邮箱不匹配');
}
// 生成6位随机验证码
const code = Math.random().toString().slice(2, 8);
// 存储验证码(有效期5分钟)
await db.collection('verificationCodes').add({
data: {
account,
code,
email,
createdAt: new Date()
}
});
// 发送邮件
const mailOptions = {
from: 'your_email@qq.com',
to: email,
subject: '密码重置验证码',
html: `<p>您的验证码是:<b>${code}</b>,5分钟内有效</p>`
};
await transporter.sendMail(mailOptions);
return { success: true };
};
2.验证并重置密码云函数 (verifyCodeAndReset
)
exports.main = async (event) => {
const { account, email, code, newPassword } = event;
const db = cloud.database();
const now = new Date();
// 查询有效验证码(5分钟内)
const codeRecord = await db.collection('verificationCodes')
.where({
account,
email,
code
})
.orderBy('createdAt', 'desc')
.get();
// 验证码校验
if (codeRecord.data.length === 0 ||
now - codeRecord.data[0].createdAt > 5 * 60 * 1000) {
throw new Error('验证码错误或已过期');
}
// 更新密码(需加密存储)
const hashedPassword = require('crypto')
.createHash('md5')
.update(newPassword)
.digest('hex');
await db.collection('users').where({ account }).update({
data: { password: hashedPassword }
});
// 删除已用验证码
await db.collection('verificationCodes').doc(codeRecord.data[0]._id).remove();
return { success: true };
};
五、安全增强建议
- 邮箱授权码管理:将授权码存入腾讯云环境变量(
process.env.EMAIL_AUTH_CODE
),避免硬编码。 - 验证码时效性:数据库存储验证码时记录时间戳,校验时检查是否超过5分钟。
- 防刷机制:限制同一邮箱/账号的发送频率(如1分钟1次),可在云函数中增加频率校验逻辑。
- 密码加密:使用 MD5/SHA256 对新密码加密存储(示例中使用了MD5)。
六、注意事项
- QQ邮箱配置
- 需登录QQ邮箱网页版 → 设置 → 账户 → 开启 SMTP服务 → 获取16位授权码。
- 云函数依赖安装
- 在云函数目录下执行
npm install nodemailer
安装邮件模块。
- 在云函数目录下执行
- 真机测试
- 微信开发者工具中可能无法调用云函数发送邮件,需使用真机测试。