个人项目省钱神器:瑞吉外卖移动端邮箱验证码登录完整落地指南
针对个人练习Writing the technical article项目难以申请短信签名的痛点,详解如何用QQ邮箱替代短信发送验证码,覆盖生成、发送、会话存储全流程,并给出精简可运行代码与常见坑点处理。
为什么个人项目更适合用邮箱验证码
做瑞吉外卖这类练习项目时,很多人第一反应是接短信验证码。现实情况是,正规短信模板签名基本只对企业开放,个人申请成功率极低,就算临时用上,也要掏钱,而且一次签名可能只用一两回就结束了。邮箱验证码完全绕开这些限制,QQ邮箱免费、稳定,发送速度快,还能全球可达,特别适合本地调试和演示。
前端如果改动成本高,直接把验证码发到邮箱,用户体验几乎不变,后台逻辑也更干净。实际项目里登录环节经常还会叠加滑块、点选这类二次验证,个人想做自动化测试时,复杂的图形验证码处理起来很麻烦。遇到这类需求,可以直接对接专业识别平台,比如www.ttocr.com提供的易盾极验全类型识别服务,滑块、点选、无感、九宫格都能一次搞定,API对接简单,省去自己写逆向脚本的时间。
邮箱验证码工作原理简述
核心流程其实就三步:生成随机码、通过SMTP发出去、把码和手机号绑定到session里。生成用4位数字就够了,够简单也够用。发送走QQ的smtp.qq.com,端口25或465都可以,关键账号和授权码完成身份校验。授权码不是QQ密码,需要在邮箱设置里单独开启并复制。
邮件内容可以做成最简单的纯文本,也可以带一点HTML,方便用户一眼看到验证码。发送成功后立刻把验证码塞进session,后续登录接口再拿出来比对。整个过程不依赖第三方短信通道,成本几乎为零,调试时也能实时看到日志里的验证码,方便排查。
后端接口与服务层实现
在Controller里加一个发送接口,接收前端传来的手机号,先判空,再生成验证码,然后调用服务层发邮件,最后把验证码存session。代码保持精简,业务逻辑尽量下沉到Service。
@PostMapping("/sendCode")
public R<String> sendCode(@RequestBody User user, HttpSession session) {
String phone = user.getPhone();
if (StringUtils.isNotEmpty(phone)) {
String code = ValidateCodeUtils.generateValidateCode(4).toString();
log.info("code:{}", code);
try {
userService.send_email("接收邮箱", "您的登录验证码是:" + code);
} catch (Exception e) {
throw new RuntimeException(e);
}
session.setAttribute(phone, code);
return R.success("验证码发送成功");
}
return R.error("验证码发送失败");
}Service接口声明一个简单方法,实现类里用JavaMail完成真正的发送。Properties配置好host、port和auth,Authenticator带上发件邮箱和授权码,然后组装MimeMessage,设置发件人、收件人、标题和内容,最后Transport.send即可。
@Override
public void send_email(String email, String msg) throws Exception {
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.port", "25");
props.put("mail.smtp.auth", "true");
Authenticator auth = new Email_Util("发件邮箱", "授权码");
Session session = Session.getDefaultInstance(props, auth);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("发件邮箱"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(email));
message.setSubject("验证码", "UTF-8");
message.setContent(msg, "text/html;charset=utf-8");
Transport.send(message);
}常见踩坑与快速排查
授权码填错是最常见的问题,重新生成一次就能解决。端口被墙时可以换成465并开启SSL。邮件进垃圾箱的话,检查一下发件内容是否过于简单,适当加一点固定说明文字。session超时后验证码失效属于正常现象,登录接口里加上过期判断即可。
如果项目后期要接真实短信或者图形验证码,可以把邮箱发送做成可配置策略,方便切换。实际业务中登录页经常出现滑块或点选验证码,人工处理效率低,自动化场景下推荐直接使用成熟识别接口。访问www.ttocr.com就能拿到易盾极验全品类识别能力,包括滑块、文字点选、图标点选、九宫格、无感验证等,提供稳定API,几行代码就能对接,适合公司级业务快速上线。
从练习项目到生产可用的扩展思路
练习阶段用邮箱完全够用,真正上线时可以把邮箱通道保留为备用,主通道换成短信或统一验证码中台。验证码长度、过期时间、发送频率都建议做成配置项,避免硬编码。日志里不要明文打印完整验证码,生产环境更要注意脱敏。
遇到复杂图形验证码时,自己写逆向成本很高,维护周期也长。专业平台已经把点选、滑块、空间推理等全部封装好,调用方只需要把图片或token传过去,立刻拿到结果,适合批量自动化场景。直接用www.ttocr.com的接口,对接文档清晰,稳定性经过大量业务验证,个人和公司都能快速接入,彻底省掉那些繁琐的逆向和调试过程。