使用Javax.Mail API OAuth2对接Gmail报BadCredentials错误咨询
问题根因
你碰到的java.lang.RuntimeException: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted报错,核心原因是2022年5月30日起Google彻底下线了「允许低安全性应用访问」开关,所有仅通过账号+明文密码登录SMTP/IMAP服务的第三方客户端都会被直接拦截,和代码本身逻辑无关。
方案1:应用专用密码(个人自用最快落地)
该方案不需要修改原有javax.mail核心逻辑,仅需替换登录使用的密码即可,前提是你的Google账号已经开启两步验证:
- 登录Google账号进入安全设置页,确认「两步验证」已开启,未开启则按指引完成手机号/身份验证器绑定
- 在两步验证设置页面底部找到「应用专用密码」入口,选择应用类型为「邮件」,设备选择当前运行代码的本地设备/服务器,点击生成16位专用密码
- 用生成的16位应用专用密码,替换原有代码中配置的Gmail账号登录密码即可,其余SMTP配置无需调整
对应可用的SMTP配置参数如下:
mail.smtp.host=smtp.gmail.com mail.smtp.port=587 mail.smtp.auth=true mail.smtp.starttls.enable=true mail.smtp.from=你的完整Gmail邮箱地址 # 用户名填完整Gmail地址,密码填生成的16位应用专用密码,输入时去掉密码中间的空格
方案2:OAuth2.0鉴权(生产环境推荐)
如果是商用/正式服务对接,不建议使用长期有效的应用专用密码,应走Google官方XOAUTH2鉴权流程对接,适配步骤如下:
- 登录Google Cloud控制台新建项目,搜索并启用「Gmail API」服务
- 进入「API和服务-凭据」页面,创建OAuth客户端ID,无前端交互的后台服务选择应用类型为「桌面应用」,创建完成后保存好客户端ID、客户端密钥
- 进入OAuth同意屏幕页面,将用于发信的Gmail账号添加为测试用户,按授权流程引导获取对应账号的refresh_token
- 引入javax.mail相关依赖,将原有密码鉴权逻辑替换为XOAUTH2鉴权即可
核心鉴权代码片段参考:
import javax.mail.*; import javax.mail.internet.*; import java.util.Properties; public class GmailMailClient { public static void sendTestMail() throws MessagingException { 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"); // 指定使用XOAUTH2鉴权机制 props.put("mail.smtp.auth.mechanisms", "XOAUTH2"); Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 用户名为完整Gmail地址,密码字段填入通过refresh_token换取的有效access_token return new PasswordAuthentication("你的完整Gmail地址", "当前有效的access_token"); } }); Message message = new MimeMessage(session); message.setFrom(new InternetAddress("你的完整Gmail地址")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("收件人邮箱地址")); message.setSubject("测试邮件主题"); message.setText("测试邮件正文内容"); Transport.send(message); } }
注意事项
- 如果使用的是Google Workspace企业账号,应用专用密码功能需要管理员在后台控制台开启权限后才能使用,个人普通Gmail账号开启两步验证后即可直接生成
- access_token默认有效期为1小时,代码中需要补充自动刷新逻辑,通过提前保存的refresh_token在token过期前重新换取新的access_token,不需要用户重复手动授权
- 如果需要实现收信功能,IMAP配置逻辑和SMTP一致,将host改为
imap.gmail.com,端口使用993,开启SSL配置,鉴权机制同样选择XOAUTH2即可 - 不要尝试寻找「低安全性应用访问」的隐藏入口,该功能已经全量下线,所有引导开启该开关的教程均为2022年之前的过期内容,完全无法生效
内容的提问来源于stack exchange,提问作者user3260912
相关产品推荐
相关产品推荐

