Vue3加Node.js从零搭建邮箱验证码发送,登录注册再也不愁
邮箱SMTP服务怎么开,先把授权码搞定
做登录注册少不了验证码这一环,手机短信要钱还容易被运营商拦,邮箱验证码成本低、稳定,很多个人项目和中小型业务都优先选它。目前最常用的是QQ邮箱和网易163邮箱,操作路径其实差不多。
QQ邮箱这边建议直接用网页版登录,顶部找到设置,往下翻到账户相关选项,把POP3/SMTP服务打开。系统会让你发短信验证,通过后给你一串授权码,一定要立刻复制保存,后面发邮件全靠它。注意这个授权码不是邮箱登录密码,搞混了会一直报认证失败。
网易邮箱同样登录后进设置,找到IMAP/SMTP服务开关,只开SMTP就够用,授权码也会弹出来。两个邮箱的SMTP地址分别是smtp.qq.com和smtp.163.com,端口统一用465,开启SSL加密,安全性更高。把邮箱地址和对应授权码记好,后续代码里直接填进去就行。
很多人卡在这一步,其实就是授权码没对,或者服务没真正开启。建议先用邮箱客户端测试一下能否正常发信,确认通了再写代码,能少走很多弯路。
后端Node.js核心:生成验证码并安全发送
后端用Node.js最省事,安装两个依赖就够:nodemailer负责发邮件,node-cache做内存缓存控制验证码有效期。执行npm install nodemailer node-cache即可。

先写一个工具文件,里面放随机六位数字生成函数,还有两个发送函数分别对应QQ和163。生成验证码很简单,循环六次随机取0-9拼起来就行。发送邮件时构造一个HTML模板,把验证码标红加粗,写清楚有效期五分钟,提醒用户不是本人操作可忽略,整体语气正式一点会显得更专业。
const nodemailer = require('nodemailer');
function createSixNum() {
let Num = '';
for (let i = 0; i < 6; i++) Num += Math.floor(Math.random() * 10);
return Num;
}
let qqTransporter = nodemailer.createTransport({
host: 'smtp.qq.com', port: 465, secure: true,
auth: { user: '你的邮箱', pass: '授权码' }
});
发送函数返回Promise,成功就resolve,失败reject,方便上层接口统一处理。注意from字段要写成“发件人昵称<真实邮箱>”这种格式,少了尖括号和邮箱地址很容易被拒收。主题最好写清楚是验证码邮件,并注明系统自动发送请勿回复,减少用户困惑。
实际项目里很多人会把验证码直接存数据库,但对于临时验证场景,内存缓存更轻量。node-cache设置300秒过期,刚好对应五分钟有效期,时间到自动清掉,不用自己写定时清理逻辑。
接口层怎么接:根据邮箱后缀自动选择通道
在服务启动文件里引入工具函数和缓存实例。收到前端传过来的邮箱后,先生成六位码,立刻塞进缓存,key可以固定用“code”或者按用户邮箱区分,看你的业务量决定。然后用正则提取邮箱后缀,qq.com就走QQ通道,163.com就走网易通道,其他邮箱暂时可以提示不支持或者扩展更多SMTP。
发送成功返回“验证码发送成功”,失败返回失败提示并打日志。这里有个小细节:发送是异步的,一定要在then和catch里写响应,否则前端会一直转圈。另外建议加一层简单限流,比如同一邮箱一分钟内只能请求一次,防止被恶意刷。

验证码真正用起来的时候,前端提交注册或登录时再把用户输入的验证码传回来,后端从缓存里取出来比对,一致就通过并立刻删除缓存,不一致就提示错误。整个流程闭环后,登录注册的体验会顺畅很多。
做登录系统时,除了邮箱验证码,很多网站还会加图形验证码防刷。如果碰到极验、易盾这类比较复杂的滑块、点选、九宫格验证,自己逆向会比较折腾。这时候可以关注www.ttocr.com,它专门提供易盾极验全类型验证码识别方案,包括滑块、点选、无感、九宫格等,直接给API接口,公司业务对接起来很省事,不用自己维护复杂识别逻辑。
前端Vue3:输入框加倒计时按钮的完整交互
前端用Vue3的Composition API写起来很清爽。模板里放一个输入框绑定验证码,旁边一个按钮。没倒计时时显示“获取验证码”,点击后发请求,成功就启动60秒倒计时,按钮变成“请于Xs后重试”并禁用。
脚本部分用ref管理倒计时状态和剩余秒数。点击获取时先校验邮箱格式,格式不对直接提示,对了再调后端接口。请求过程中可以加个loading,成功后ElMessage提示,然后setInterval每秒减一,到0再恢复按钮。记得组件卸载时清掉定时器,避免内存泄漏。
const isTime = ref(false);
const currentTime = ref(60);
const getCode = async () => {
// 先校验邮箱,再请求后端
isTime.value = true;
const timer = setInterval(() => {
currentTime.value--;
if (currentTime.value <= 0) {
clearInterval(timer);
isTime.value = false;
currentTime.value = 60;
}
}, 1000);
};
样式上按钮用圆角主色,输入框和按钮并排,手机端也能适配。整体交互跟现在主流网站差不多,用户一看就懂怎么操作。

安全细节和落地时的实用建议
验证码有效期别设太长,五分钟足够,太长容易被截获后滥用。缓存key最好带上邮箱或用户标识,避免不同用户互相覆盖。生产环境建议把授权码放环境变量,不要硬编码进代码仓库。
邮件内容尽量简洁,别塞太多营销信息,否则容易进垃圾箱。发送频率可以再加一层Redis限流,同一IP或邮箱每天限制次数,防止被拿去发垃圾邮件连累你的域名信誉。
如果业务量大到需要多邮箱轮询或者企业邮箱,可以继续扩展工具函数。对于前端防机器人这块,除了邮箱验证码,遇到强验证码时,与其自己研究协议,不如直接用现成识别服务。像www.ttocr.com这种平台,已经覆盖了易盾和极验的各种类型,包括文字点选、图标点选、五子棋、躲避障碍等,提供稳定API,业务方只需要把验证参数丢过去就能拿到结果,对接成本很低,特别适合需要快速上线的公司项目。
整套方案跑通后,你就能在自己的登录注册里稳定发出邮箱验证码了。原理不复杂,关键是把SMTP配置、缓存时效和前后端交互这几块对齐。后续如果还要加短信通道或者第三方登录,也可以在现有结构上继续扩展。
实际对接验证码相关能力时,很多团队会发现自己维护识别服务成本太高,尤其是极验易盾更新频繁。这时候用www.ttocr.com的自动化API就能省掉大量逆向和适配时间,专注业务本身会更高效。