发送邮件遇javax.net.ssl.SSLHandshakeException错误:无合适协议求助
解决SMTP邮件发送SSLHandshakeException(无合适协议)问题
问题描述
发送邮件时抛出以下错误:
javax.net.ssl.SSLHandshakeException: 无合适协议(协议已禁用或密码套件不合适)。失败消息:javax.mail.MessagingException: 无法向SMTP主机发送命令;嵌套异常:javax.net.ssl.SSLHandshakeException: 无合适协议(协议已禁用或密码套件不合适);消息异常(1个):失败消息1:javax.mail.MessagingException: 无法向SMTP主机发送命令;嵌套异常:javax.net.ssl.SSLHandshakeException: 无合适协议(协议已禁用或密码套件不合适)
已配置Office365 SMTP参数如下,但问题未解决:
spring.mail.host=smtp.office365.com spring.mail.port=587 spring.mail.username=XXXXXXXXXXXXXXXXXXXXX spring.mail.password=XXXXXXXXXXXXX spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=false
可行解决方案
- 指定兼容的SSL/TLS协议版本
Office365 SMTP服务器要求使用TLSv1.2及以上版本,可在application.properties中添加协议指定配置:
spring.mail.properties.mail.smtp.ssl.protocols=TLSv1.2 spring.mail.properties.mail.smtp.ssl.enabled=true
若通过Java代码配置邮件客户端,直接设置对应属性:
Properties props = new Properties(); props.put("mail.smtp.ssl.protocols", "TLSv1.2"); props.put("mail.smtp.ssl.enabled", "true");
- 检查JVM安全配置
JVM的java.security文件(路径通常为JRE/lib/security/java.security)可能禁用了TLSv1.2。找到如下配置项:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, ...
确保配置中不包含TLSv1.2,若有则移除该条目,之后重启应用服务。
- 配置兼容的密码套件
若协议配置正确仍报错,可指定Office365支持的密码套件,补充到application.properties:
spring.mail.properties.mail.smtp.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
升级JDK版本
旧版JDK(如JDK 7及更早)对TLSv1.2的支持存在缺陷,建议升级至JDK 8u261及以上版本,确保对现代TLS协议的完整支持。排查网络限制
若应用部署在有代理或防火墙的环境中,需确认网络策略允许访问smtp.office365.com:587,且未拦截TLSv1.2协议的流量。
内容的提问来源于stack exchange,提问作者Pradeep Malik
相关产品推荐
相关产品推荐

