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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:36:27