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

Java邮件发送类认证失败:用户名和密码不被接受

Java邮件发送类认证失败:用户名和密码不被接受

我太懂这种明明反复核对了用户名密码、配置看起来也没毛病,但就是弹认证失败错误的挫败感了!先看看你遇到的具体错误:

Authentication failed: 535-5.7.8 Username and Password not accepted. For more information, go to
535 5.7.8 https://support.google.com/mail/?p=BadCredentials 5b1f17b1804b1-43656b4432dsm341121805e9.41 - gsmtp

再结合你贴出来的代码,我给你梳理几个大概率能解决问题的方向:

1. 优先确认两步验证(2FA)与应用专用密码

如果你的Google账号开启了两步验证,绝对不能用普通的账号密码来认证SMTP!必须使用Google生成的「应用专用密码」:

  • 登录Google账号的安全设置页面,找到「应用专用密码」选项(需要先开启2FA才能看到)
  • 生成一个专门用于邮件发送的密码,替换你代码里的password字段

2. 检查账号安全状态

有时候Google会因为异常登录尝试锁定你的账号,你可以登录你的Gmail邮箱,看看有没有收到Google发来的「异常登录提醒」邮件,按照提示解锁账号,允许该设备/应用的访问。

3. 优化代码中的认证逻辑

你的代码里已经通过Session.getInstance()传入了自定义的Authenticator,但在发送邮件时又重复传递了from和password参数,这可能会导致冲突。可以把Transport.send(message, from, password);改成:

Transport.send(message);

让Session里的认证信息来处理登录,避免重复传参带来的问题。

4. 确认SMTP配置的正确性

你的配置是没问题的:

  • SMTP主机smtp.gmail.com、端口587、启用TLS这些都是Google推荐的正确配置,不过可以再确认一下你的网络没有拦截587端口(比如防火墙、代理的限制)。

最后再贴一下调整后的关键代码片段供你参考:

// ... 前面的Session初始化代码不变

try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject("Test Email");
    message.setText("This is a test email to verify SMTP configuration.");
    
    // 这里去掉重复的账号密码参数
    Transport.send(message);
    System.out.println("Sent message successfully....");
} catch (AuthenticationFailedException e) {
    System.err.println("Authentication failed: " + e.getMessage());
    throw new RuntimeException(e);
} catch (MessagingException e) {
    e.printStackTrace();
}

备注:内容来源于stack exchange,提问作者user24696530

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:22:58