基于腾讯云开发(Tencent Cloud Base)实现小程序邮箱验证找回密码功能的完整逻辑说明及关键代码实现。结合安全性和开发效率,方案采用 ​​云函数 + 小程序前端​​ 的架构,使用 ​​Nodemailer​​ 发送邮件。Nodemailer 是一个专为 Node.js 设计的开源邮件发送库,用于在服务端高效、灵活地处理电子邮件发送任务。它通过简化邮件传输协议(如 SMTP)的复杂性,为开发者提供了强大的邮件管理能力。

一、实现原理

用“快递站”比喻来解释这个流程:​

  1. ​快递站代发包裹(系统统一发验证码)​
    公司搭了个快递站(系统邮箱),专门代发验证码“包裹”。用户填个收件地址(邮箱),站长立刻打包发出📮。

  2. ​用户只管收件(注册流程)​
    用户啥也不用干,留完地址就坐等收件。拆开包裹填个验证码,立马进门(完成验证)✅。

  3. ​站长领把钥匙(管理员配一次)​
    给快递站申请个专属钥匙(获取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 };
};

3.在数据库创建systemConfig集合

{"type": "email","email": "your_email@qq.com",      // 完整的QQ邮箱地址"host": "smtp.qq.com",            // SMTP服务器地址"port": 465,                      // 必须为465端口"authCode": "your_16_digit_code", // 从QQ邮箱设置获取的16位授权码"service": "QQ",                  // 服务标识(可选)"senderName": "系统通知",          // 发件人显示名称(可选)"secure": true                    // 启用SSL加密传输
}

五、安全增强建议

  1. ​邮箱授权码管理​​:将授权码存入腾讯云​​环境变量​​(process.env.EMAIL_AUTH_CODE),避免硬编码。
  2. ​验证码时效性​:数据库存储验证码时记录时间戳,校验时检查是否超过5分钟。
  3. ​防刷机制​:限制同一邮箱/账号的发送频率(如1分钟1次),可在云函数中增加频率校验逻辑。
  4. ​密码加密​:使用 ​​MD5/SHA256​​ 对新密码加密存储(示例中使用了MD5)。

 六、注意事项

  1. ​QQ邮箱配置​
    • 需登录QQ邮箱网页版 → 设置 → 账户 → 开启 ​​SMTP服务​​ → 获取16位授权码。
  2. ​云函数依赖安装​
    • 在云函数目录下执行 npm install nodemailer 安装邮件模块。
  3. ​真机测试​
    • 微信开发者工具中可能无法调用云函数发送邮件,需使用真机测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88994.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88994.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88994.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# VB.NET中Tuple轻量级数据结构和固定长度数组

C# VB.NET取字符串中全角字符数量和半角字符数量-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148871910 在VB.NET中&#xff0c;使用Tuple和固定长度数组在性能上有细微差异&#xff0c;以下是详细分析&#xff1a; 性能对比测试 通过测试 100 万次调用&am…

建筑物年代预测与空间异质性分析解决方案

建筑物年代预测与空间异质性分析解决方案 1. 问题分析与创新点设计 核心任务:预测建筑物建造年代,并分析空间异质性对预测的影响 创新点设计: 空间权重矩阵集成:构建空间邻接矩阵量化地理邻近效应多尺度特征提取:融合建筑物微观特征与街区宏观特征异质性分区建模:基于…

FOUPK3system5XOS

Foupk3systemX5OS系统19.60内测版&#xff08;X9&#xff09;2023年4月16日正式发布 1.0Foupk3systemX5OS系统19.60&#xff08;X9&#xff09;2024年10月6日发布 Foupk3systemX5OS系统19.60增强版&#xff08;X9X5&#xff09;2024年10月6日发布Foupk3systemX5OS系统19.60正…

随机生成的乱码域名”常由**域名生成算法(DGA)** 产生

“随机生成的乱码域名”常由**域名生成算法&#xff08;DGA&#xff09;** 产生&#xff0c;是网络攻击&#xff08;尤其是僵尸网络、恶意软件控制场景 &#xff09;中躲避检测的手段&#xff0c;以下是关键解析&#xff1a; ### 一、本质与产生逻辑 乱码域名是攻击者利用 **DG…

Solidity学习 - 继承

文章目录 前言继承的基本概念继承的基本用法单继承实现函数重写&#xff08;overriding&#xff09; 构造函数的继承处理多重继承抽象合约 前言 继承是面向对象编程中的核心概念之一&#xff0c;Solidity作为一种面向对象的智能合约语言&#xff0c;同样支持继承机制。通过继承…

依赖注入(Dependency Injection, DI)的核心概念和解决的核心问题

核心概念&#xff1a; 依赖注入是一种设计模式&#xff0c;也是实现控制反转&#xff08;Inversion of Control, IoC&#xff09; 原则的一种具体技术。其核心思想是&#xff1a; 解耦&#xff1a; 将一个类&#xff08;客户端&#xff09;所依赖的其他类或服务&#xff08;依…

Reactor Schedulers

Reactor 是一个基于响应式编程的库&#xff0c;它提供了丰富的调度器&#xff08;Schedulers&#xff09;机制&#xff0c;用于管理异步操作的执行环境。Schedulers 是 Reactor 中的核心组件之一&#xff0c;它们允许开发者灵活地控制操作符和订阅操作在哪个线程上执行&#xf…

设备树引入

一、设备树的基本知识 1、什么是设备树&#xff1f;为什么会有设备树&#xff1f; 2011年&#xff0c;Linux之父Linus Torvalds发现这个问题后&#xff0c;就通过邮件向ARM-Linux开发社区发了一封邮件&#xff0c;不禁的发出了一句“This whole ARM thing is a f*cking pain i…

【数据标注师】3D标注

目录 一、 **3D标注知识体系框架**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;空间认知筑基&#xff08;2-3周&#xff09;**▶ **阶段2&#xff1a;核心标注技能深化**▶ **阶段3&#xff1a;复杂场景解决方案**▶ **阶段4&#xff1a;领域深度专精▶ **阶段5&#xff1…

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…

【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组

Problem: 438. 找到字符串中所有字母异位词 题目&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——&#xff08;解法一&…

PAC 学习框架:机器学习的可靠性工程

PAC&#xff08;Probably Approximately Correct&#xff09; 是机器学习理论的核心框架&#xff0c;用于量化学习算法的可靠性。它回答了一个关键问题&#xff1a; “需要多少训练样本&#xff0c;才能以较高概率学到一个近似正确的模型&#xff1f;” 一、PAC 名称拆解 术语…

嵌入式C语言数组:数组/字符数组

1. 数组 1.1 一维数组 数组是一串连续的地址&#xff1b; 数组名是地址常量&#xff0c;代表数组的起始地址&#xff1b; sizeof&#xff08;数组名&#xff09; 可得出数组的总内存空间&#xff1b; C 语言对数组不做越界检查&#xff0c;使用时应注意&#xff1b; 数组不…

变长字节的数字表示法vb224

开始 数字有大有小&#xff0c;用多少字节表示呢&#xff1f; 本文描述的方案&#xff0c;采用变化的长度。vb是varying bytes的意思&#xff0c;224是表示它特征的一个数。 第一版&#xff1a; 每个字节8比特&#xff0c;最高的1比特用来表示“是否连续”&#xff0c;0表示…

ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)

背景&#xff1a; 现在主流的博客平台AI接入不够完善&#xff0c;如CSDN接入的AI助手不支持多模态数据的交互、稀土掘金的编辑器AI功能似乎还没能很好接入&#xff08;哈哈哈&#xff0c;似乎在考虑布局什么&#xff1f;&#xff09; 痛点分析&#xff1a; 用户常常以截图的形式…

【数据标注师】关键词标注

目录 一、 **理解关键词标注的核心逻辑**1. **三大标注原则**2. **关键词类型体系** 二、 **四阶训练体系**▶ **阶段1&#xff1a;基础规则内化**▶ **阶段2&#xff1a;语义浓缩训练**▶ **阶段3&#xff1a;场景化标注策略**▶ **阶段4&#xff1a;工具效率提升** 三、 **五…

for each循环语句

for each循环语句 for each.....nextFor Each 的案例 for each…next 1、循环对象合集 worksheets workbooks range range("区域")selection (选中的区域)usedrange或者currentregion 返回的单元格区域格式&#xff1a; for each 变量名 in 对象集合(范围)循环内容…

基于LQR控制器的六自由度四旋翼无人机模型simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统原理简介 5.参考文献 6.完整工程文件 1.课题概述 四旋翼无人机因其结构简单、机动性强和成本低廉等特点&#xff0c;在航拍测绘、物流运输、灾害救援等领域得到广泛应用。六自由度&#xff08;3维平移3维旋转&#xff0…

vftp centos 离线部署

install_ftp_offline.sh vsftpd-3.0.2-28.el7.x86_64.rpm #!/bin/bash# 一键安装配置vsftpd脚本&#xff08;开放根目录&#xff0c;禁用chroot&#xff09;# 安装vsftpd RPM包 echo "正在安装vsftpd..." rpm -ivh vsftpd-3.0.2-28.el7.x86_64.rpm if [ $? -ne 0 …

【数据标注】事件标注1

目录 **一、 深入理解事件标注的核心概念****二、 系统学习&#xff1a;从理论到实践****1. 吃透标注指南****2. 语言学基础补充****3. 事件结构解析训练** **三、 分阶段实践&#xff1a;从简单到复杂****阶段1&#xff1a;基础标注训练****阶段2&#xff1a;进阶挑战****阶段…