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

Java邮件发送执行异常:程序中断无输出无邮件发送求助

问题排查与修复建议

从日志输出停在inside gmail seings来看,程序卡在了GmailConfigurations.getGmailSettings()方法的EmailCredSetting cred = emailCred.getEmailCred();这一行,后续代码未执行,核心原因及解决方法如下:

1. 手动实例化Spring Bean导致依赖注入失效

GmailConfigurations是被@Component标记的Spring托管Bean,但你在configureMailProps()里用new GmailConfigurations()手动创建实例,这会导致Spring无法为其注入emailCred依赖:

  • 若emailCred为null,调用getEmailCred()时可能触发未捕获的异常(被上层隐性吞掉),或该方法内部处理null时陷入阻塞;
  • 非Spring托管的Bean可能存在资源初始化不完整的情况,导致后续操作卡住。

修复方案:在当前类(包含sendPasswordResetCode的类)中注入GmailConfigurations,而非手动实例化:

// 在当前类中添加注入
@Autowired
private GmailConfigurations gmailConfigurations;

private JavaMailSenderImpl configureMailProps() {
    log.info("inside config");
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    // 替换new为注入的实例
    GmailSettings gmail = gmailConfigurations.getGmailSettings();
    log.info(gmail.toString());
    // ... 后续代码保持不变
}

2. EmailCredService.getEmailCred()方法阻塞

如果注入问题修复后仍卡住,需排查emailCred.getEmailCred()的实现:

  • 该方法可能在执行耗时操作(如数据库查询超时、远程API调用无响应);
  • 可能存在死锁(比如数据库锁表、线程资源竞争)。

排查步骤:

  • 在EmailCredService.getEmailCred()方法的入口和关键步骤添加日志,确认是否进入方法及执行到哪一步;
  • 检查数据库状态:查看是否有慢查询、锁表情况,数据库连接池是否耗尽;
  • 若涉及远程服务调用,检查服务可用性、超时配置是否合理。

3. 线程状态诊断

使用jstack命令查看当前JVM线程状态,定位阻塞点:

# 替换<pid>为你的应用进程ID
jstack <pid>

找到执行sendPasswordResetCode的线程,查看其栈轨迹,即可明确卡在哪个方法或代码行。

4. 日志配置验证

检查日志框架配置,确认GmailConfigurations类的日志级别未被设置为高于INFO,避免后续日志被过滤。


内容的提问来源于stack exchange,提问作者Gulshan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:45:32