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

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配置正确:
    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版本
    
    然后用这个App Password作为密码创建Authenticator实例。

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:38:26