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
相关产品推荐
相关产品推荐

