JSP发送Gmail遇SMTP连接及SSL协议异常的解决咨询
javax.mail.MessagingException 连接smtp.gmail.com:587失败(SSLHandshakeException: 无合适协议)问题解析
错误成因
- Google早在2022年就彻底关停了「低安全性应用」的支持,传统用用户名+密码直接登录SMTP的方式已经完全失效,Google会直接拒绝这类不安全的连接请求,导致JVM找不到合适的SSL协议完成握手。
- 另外,如果你的JVM版本过低(比如Java 8以下),默认不支持TLS 1.2/1.3,而Gmail SMTP现在只允许这两个版本的加密连接,也会触发这个错误。
解决方案
方案1:用Google App Passwords(最推荐)
前提是你的Google账号开了两步验证:
- 登录Google账号,进「安全」设置页,找到「App Passwords」选项。
- 生成一个专用于SMTP的应用密码(注意:这个密码只显示一次,务必存好)。
- 修改JSP代码里的认证信息,把原来的密码换成这个生成的应用密码,同时确保SMTP配置正确:
然后用这个App Password作为密码创建Authenticator实例。Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); // 必须开启STARTTLS props.put("mail.smtp.ssl.protocols", "TLSv1.2,TLSv1.3"); // 指定支持的TLS版本
方案2:OAuth 2.0认证
如果没法开两步验证(或者不想用App Passwords),可以用OAuth 2.0方式:
- 去Google Cloud Console创建项目,启用Gmail API,生成客户端ID和密钥。
- 在JSP代码里集成JavaMail的OAuth 2.0支持,先获取访问令牌再做SMTP认证。这种方式步骤多,但适合企业级场景。
方案3:升级JVM并配置TLS参数
确保运行环境用的是Java 8及以上版本,还可以给JVM加启动参数强制启用TLS 1.2/1.3:
-Dhttps.protocols=TLSv1.2,TLSv1.3
和校园公共WiFi的关系
大概率没关系。校园WiFi一般只会限制25这类非加密SMTP端口,587是标准加密端口,很少会被拦截。要是怀疑,可以切换到手机热点测试:换热点后问题依旧,就和WiFi无关;如果能正常发送,那可能是校园防火墙拦截了SMTP连接,得找网络管理员确认。
内容的提问来源于stack exchange,提问作者user20898355
相关产品推荐
相关产品推荐

