使用JavaMail发送邮件时抛出NoSuchMethodError异常求助
Hey,我来帮你搞定这个邮件发送的异常问题!这个NoSuchMethodError其实是两个关键问题叠加导致的,咱们一步步拆解解决:
问题根源分析
这个java.lang.NoSuchMethodError: sun.security.ssl.SessionId.checkLength(Lsun/security/ssl/ProtocolVersion;)V异常,核心原因有两个:
- JDK版本过旧:JDK 1.8.0_20的SSL组件缺少这个关键方法——
SessionId.checkLength()是在JDK 8u101及后续版本中才新增的,而Gmail现在要求的TLS 1.2协议依赖这些更新的SSL API,旧JDK完全无法适配。 - JavaMail依赖冲突:Glassfish 5作为Java EE容器,本身已经内置了JavaMail的实现,而你的pom.xml中又引入了独立的
com.sun.mail:javax.mail依赖,这会导致类加载时出现冲突,进一步加剧问题。
解决步骤
1. 升级JDK到8u101及以上版本
JDK 8u20实在太老旧了,不仅存在安全漏洞,还不支持现代邮件服务要求的TLS协议特性:
- 下载并安装**JDK 8u101+**的稳定版本(比如8u301,Oracle或OpenJDK发行版都可以)
- 修改Glassfish的JDK配置:
在Mac上,打开Glassfish安装目录下的config/asenv.conf文件,添加或修改如下配置:
替换成你实际安装的新JDK路径,然后重启Glassfish服务,确保容器确实使用了新JDK。export AS_JAVA=/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home
2. 修复JavaMail依赖冲突
Glassfish已经提供了JavaMail的实现(包含在Java EE 8 API中),不需要额外引入依赖:
- 修改你的pom.xml,把
com.sun.mail:javax.mail依赖的scope改为provided,或者直接移除:<!-- 推荐修改为provided,避免类加载冲突 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.1</version> <scope>provided</scope> </dependency>
3. 验证Gmail的邮件发送配置
确保你的Gmail账号配置符合平台要求:
- 如果开启了两步验证,必须使用应用专用密码代替普通密码登录SMTP服务(普通密码会被Gmail拒绝)
- 确认SMTP参数完全正确:
String host = "smtp.gmail.com"; String port = "587"; - 若未开启两步验证,需要暂时开启Gmail的“不太安全的应用访问”(更推荐使用应用专用密码,安全性更高)
4. 开启调试模式排查细节
如果完成上述步骤后仍有问题,可以开启JavaMail的调试模式,输出详细的SMTP交互日志:
session.setDebug(true);
这会在控制台打印邮件发送的全流程细节,方便你进一步定位剩余问题。
内容的提问来源于stack exchange,提问作者Henrique Ordine
相关产品推荐
相关产品推荐

