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

JavaMailSender发Gmail邮件报AuthenticationFailedException求助

问题定位

你遇到的javax.mail.AuthenticationFailedException是Gmail安全策略调整导致的必然结果:Google在2022年5月正式全量下线「允许低安全性应用访问」功能,所有直接使用账号明文密码登录SMTP服务的第三方调用,都会被直接拒绝认证,和你贴出的异常栈、配置截图的故障表现完全匹配。

解决方案(按改造成本从低到高排序)

方案1:使用应用专用密码(最小改动,兼容原有代码)

这个方案只需要替换配置里的密码字段,原有Java代码、SMTP配置完全不用调整,是个人开发、测试场景最快的解决方式,前提是你的Gmail账号已经开启两步验证:

  • 进入Google账号管理页,左侧菜单栏选择「安全性」,在「登录Google」板块找到「两步验证」选项,按提示完成身份校验开启两步验证
  • 两步验证开启后,同个「安全性」板块会出现「应用专用密码」入口,进入后选择应用类型为「邮件」,设备类型根据你部署服务的实际场景选择即可,点击「生成」会得到一串16位长度的应用专用密码
  • 将JavaMailSender配置中原先填写的Gmail账号登录密码,替换为这串16位密码即可,注意不要保留密码生成时显示的分隔空格,直接拼接成连续字符串填入配置

注意:应用专用密码和账号主密码权限隔离,仅用于邮件客户端登录,就算泄露也可以随时在Google账号页删除作废,不会影响主账号安全。如果你的账号是Google Workspace企业账号,需要先让管理员在后台开启「允许用户管理应用专用密码」的权限,否则个人账号页看不到对应入口。

方案2:使用OAuth2.0认证(官方推荐,安全性最高)

如果你的服务对安全合规要求高,不想用固定密码的认证方式,可以改用Gmail官方推荐的XOAUTH2认证模式:

  • 登录Google Cloud控制台创建新项目,在「API和服务-库」中搜索并启用Gmail API
  • 进入「OAuth同意屏幕」配置页面,选择外部用户类型,填写必要的应用信息,把你用来发信的Gmail账号添加为测试用户
  • 进入「凭据」页面创建OAuth 2.0客户端ID,记录生成的clientId和clientSecret,通过OAuth授权流程获取对应发信账号的refreshToken
  • 升级JavaMail依赖到最新的com.sun.mail:jakarta.mail版本(原生支持XOAUTH2认证),修改邮件发送配置,将原有密码认证逻辑替换为XOAUTH2令牌认证即可

注意:未提交Google审核的OAuth测试应用,生成的refreshToken有效期只有7天,生产环境使用需要按Google要求完成应用合规审核。

方案3:切换至专业邮件发送服务(适合生产环境批量发信)

如果是生产环境使用,个人Gmail账号本身有发信频率限制(单日最多发100封左右),很容易被判定为垃圾邮件封号,更推荐直接使用专业的邮件推送服务:

  • 海外场景可选SendGrid、Mailgun、Amazon SES
  • 国内场景可选阿里云邮件推送、腾讯云SES
  • 这类服务大多兼容标准SMTP协议,只需要替换JavaMailSender里的SMTP服务器地址、端口、账号密码为服务方提供的配置即可,部分服务还提供官方SDK,不用自己处理认证、重试、送达率统计等逻辑。
避坑提醒
  • 出现认证失败后不要反复用旧密码重试,连续多次认证失败会触发Gmail的IP封禁机制,就算后续换了正确配置,也要等几小时IP解封后才能正常发信
  • 如果服务部署在国内,先通过telnet smtp.gmail.com 587命令测试网络连通性,网络不通也会抛出类似的认证失败异常,不要上来就排查账号配置
  • 如果开启了应用专用密码还是认证失败,检查JavaMail配置里有没有开启mail.smtp.starttls.enable=true,Gmail的587端口必须开启TLS才能正常连接

内容的提问来源于stack exchange,提问作者Zen Nguyễn Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:09:34