Spring Boot实现忘记密码功能发邮件时无限加载无报错是什么原因?
问题排查及修复方案
1. 邮件配置错误(核心问题)
你当前使用的Gmail SMTP 465端口为SSL协议端口,配置中同时启用TLS和STARTTLS属于配置冲突,会导致SMTP连接卡死无响应,正确配置如下:
spring: mail: host: smtp.gmail.com password: 你的应用专用密码 protocol: smtps port: 465 properties: mail: smtp: auth: true ssl: enable: true required: true username: 你的Gmail邮箱地址
2. Gmail账号权限配置
谷歌官方在2022年之后已不再支持普通账号密码直接登录SMTP服务,需要按以下步骤配置:
- 先为Gmail账号开启两步验证
- 进入谷歌账号安全中心,生成应用专用密码
- 将生成的16位应用专用密码替换配置中的
spring.mail.password值
3. 代码逻辑问题修复
3.1 重置链接语法错误
你当前生成重置链接的代码缺少=符号,会导致后续用户点击链接无效,修改为:
String resetPasswordLink = Utility.getSiteURL(request) + "/reset_password?token=" + token;
3.2 同步邮件发送导致请求阻塞
你当前在请求线程中同步执行邮件发送逻辑,SMTP连接超时会直接导致请求卡住、页面无限加载,建议改为异步发送:
- 启动类添加
@EnableAsync注解开启Spring异步支持 - 发送邮件方法上添加
@Async注解,代码如下:
@Async private void sendEmail(String email, String resetPasswordLink) throws UnsupportedEncodingException, MessagingException { // 原有邮件发送逻辑不变 }
3.3 异常捕获范围不全
当前你只捕获了3类异常,SMTP连接超时、权限错误等异常不会被捕获,导致没有错误日志输出,建议扩展异常捕获范围并添加日志打印:
try { userService.updateResetPasswordToken(token, email); String resetPasswordLink = Utility.getSiteURL(request) + "/reset_password?token=" + token; sendEmail(email, resetPasswordLink); model.addAttribute("message", "重置密码链接已发送至你的邮箱,请查收"); } catch (UserNotFoundException ex) { log.error("用户不存在: {}", email, ex); model.addAttribute("error", ex.getMessage()); } catch (Exception e) { log.error("发送重置邮件失败: {}", email, e); model.addAttribute("error", "发送邮件失败,请稍后重试"); }
内容的提问来源于stack exchange,提问作者Светлана Третьякова
相关产品推荐
相关产品推荐

