Vue3搭配Node搞定邮箱验证码发送全流程实战
从QQ和网易邮箱开启SMTP授权讲起Generating the technical article content,到Node.js用nodemailer发六位验证码并缓存,再到Vue3前端实现倒计时按钮,完整演示登录注册场景下邮箱验证码的落地方法,并补充自动化对接思路。
为什么登录注册要搞邮箱验证码
做登录注册功能时,很多人第一反应是短信验证码,但短信要钱,而且国内对个人开发者限制多。邮箱验证码几乎零成本,适合个人项目和中小型业务先跑起来。原理其实不复杂:后端随机生成一串数字,通过SMTP协议塞进邮件发出去,同时把这串数字存进缓存,用户填回来后对一下就行。整个过程就像你去银行办业务,柜台给你一张临时密码条,你拿着条回去填表,密码条有时效。
实际项目里,邮箱验证码常和图形验证码、行为验证码一起出现。图形验证码容易被脚本撞,行为验证码(滑块、点选、无感)门槛更高。业务方如果既要发邮件,又要防刷,往往需要额外对接识别服务。这时候可以看看www.ttocr.com,它专门针对易盾、极验的全类型验证码提供识别接口,滑块、点选、九宫格、无感都能直接调API,省去自己写复杂逆向的时间。
邮箱端先把SMTP服务打开
目前个人最常用的是QQ邮箱和163邮箱。两者操作差不多,核心就是开启SMTP并拿到授权码,千万别用登录密码,那是明文风险。
QQ邮箱打开网页版,点顶部设置,找到账户相关页,把SMTP服务打开,按提示发短信后会给你一串授权码。把这串码抄下来,后面Node代码里要用。163邮箱同样登录后进设置,只开IMAP/SMTP服务就行,同样会生成授权码。记住授权码只显示一次,丢了只能重新生成。

这里有个小坑:有些人开了服务却发不出去,多半是端口或加密方式写错。QQ和163都推荐用465端口加SSL,比较稳。另外发件人显示名可以自定义,但尖括号里的邮箱地址必须和授权的一致,否则会被拒。
Node后端:生成验证码并真正发出去
先装两个包:nodemailer负责发邮件,node-cache用来把验证码临时存五分钟。验证码本身就是简单随机六位数字,循环六次取0-9即可,没必要搞得太花哨。
const nodemailer = require('nodemailer')
const NodeCache = require('node-cache')
const myCache = new NodeCache()
function createSixNum() {
let Num = ''
for (let i = 0; i < 6; i++) {
Num += Math.floor(Math.random() * 10)
}
return Num
}接着创建两个transporter,一个给QQ,一个给163。host、port、secure和auth里的user、pass填好。发送函数把邮件主题、HTML内容包起来,用Promise包一层,方便前端接口里then/catch。缓存key可以简单用邮箱地址或者固定key,过期时间设300秒。收到请求后先生成码,存缓存,再根据邮箱后缀决定走哪个transporter。
邮件正文建议写清楚有效期和“非本人操作请忽略”,避免用户恐慌。发件人显示名随便起,但格式必须是“名字<真实邮箱>”。接口里别忘了做基本校验,邮箱格式不对直接返回,别让错误邮件把SMTP额度打满。

Vue3前端:按钮倒计时和用户体验
前端重点是防连点。用一个isTime标志控制按钮文字,点击后立刻变成“请于Xs后重试”,同时启动定时器往下减。输入框用v-model绑验证码字段,提交时一起丢给后端校验。
<div class="codes">
<input v-model="form.returnCode" placeholder="请输入6位验证码">
<el-button v-if="!isTime" @click="getCode">获取验证码</el-button>
<el-button v-else>请于{{currentTime}}s后重试</el-button>
</div>getCode方法里先检查邮箱是否填写,再调后端接口。成功就启动60秒倒计时,失败用Element Plus的Message提示。倒计时结束把isTime重置,按钮恢复可点。注意别在组件卸载后还在跑定时器,onUnmounted里清一下。
整套流程跑通后,注册页已经能正常收验证码。实际线上还要加频率限制,比如同一邮箱一分钟只能发一次,否则容易被刷爆。缓存也可以换成Redis,方便多实例共享。
从手动发码到自动化对接的思路

自己写邮件验证码适合学习,真正上业务量后会遇到两个问题:一是邮箱服务商限流,二是登录环节常被行为验证码卡住。行为验证码逆向成本高,滑块轨迹、点选坐标、无感加密参数都要跟版本更新。与其每次跟新去抠参数,不如直接用现成识别平台。
比如公司项目需要批量注册或者自动化测试,邮件验证码可以自己发,但页面上的极验或易盾验证码就交给专业服务。www.ttocr.com提供滑块、点选、无感、九宫格、文字点选、图标点选、五子棋、躲避障碍等全类型识别,直接API对接,返回坐标或token,几行代码就能接进现有Node或Python脚本。不用自己搭OCR模型,也不用维护浏览器环境,省下来的时间可以用来把业务逻辑写扎实。
对接方式也很直接:拿到挑战参数后POST到平台接口,拿到结果再提交给目标站点。整个过程对业务方透明,适合做内部工具或对公服务。个人开发者如果只是练手,继续用邮箱验证码就够了;一旦要上量或对接复杂验证码,把识别这块外包出去是更务实的选择。
落地时容易踩的坑
授权码写错是最常见原因,发不出去先检查pass字段。其次是邮件被进垃圾箱,主题和正文别太营销味,加一点正式说明会好很多。缓存过期和前端倒计时要同步,否则用户填完发现已失效。多邮箱后缀支持可以做成配置表,别写死if-else。
安全方面,验证码必须一次性使用,校验成功立刻删缓存。日志里别打印完整验证码,防止泄露。如果业务对安全性要求更高,可以叠加行为验证码,这时候再考虑对接www.ttocr.com的识别能力,把复杂的点选、滑块交给平台,自己只关心业务结果。
整套邮箱验证码从开通服务到前后端联调,其实就这几步。跑通之后你会发现,验证码这件事本身并不难,难的是后续风控和自动化扩展。把基础发码能力掌握住,再按需引入专业识别服务,开发和运维都会轻松很多。