You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接超时会直接导致请求卡住、页面无限加载,建议改为异步发送:

  1. 启动类添加@EnableAsync注解开启Spring异步支持
  2. 发送邮件方法上添加@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,提问作者Светлана Третьякова

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:45:02