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

使用Javax发送Gmail邮件时遭遇AuthenticationFailedException求助

解决Gmail SMTP认证失败(535-5.7.8)问题

核心原因

Google目前已经不再允许使用普通账户密码通过SMTP协议登录,哪怕密码完全正确,也会触发535-5.7.8认证失败。必须改用应用专用密码(前提是你的Google账户已经启用了两步验证),同时代码里的配置也有几处冲突需要修正。

步骤1:配置Google账户安全设置

  • 登录你的Google账户,先开启两步验证(没开的话没法生成应用专用密码)。
  • 进入账户的「安全」页面,找到「应用专用密码」选项,生成一个专门给SMTP用的密码(这个密码只会显示一次,一定要记下来)。
  • 之后代码里的密码就用这个生成的应用专用密码,别再用原账户密码了。

步骤2:修正代码中的配置问题

你的代码存在几处可能导致认证失败或连接异常的配置错误,以下是修正后的版本:

class SimpleAuth extends Authenticator {
    private final String username;
    private final String password;

    public SimpleAuth(String user, String pwd) {
        this.username = user;
        this.password = pwd;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
}

public boolean send() throws Exception {
    // Smtp server
    final String smtp = "smtp.gmail.com";
    final String port = "465"; // SSL专用端口

    // Properties setting
    Properties props = new Properties();

    // 移除错误的自定义主机配置,直接使用Gmail SMTP主机
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", smtp);
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", port);
    
    // SSL相关配置优化
    props.put("mail.smtp.socketFactory.port", port);
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    // 禁用降级 fallback,确保只使用SSL连接
    props.put("mail.smtp.socketFactory.fallback", "false");
    props.put("mail.smtp.ssl.protocols", "TLSv1.2");
    
    // 465是直接SSL连接,不需要starttls(这是587端口TLS升级用的,开启会冲突)
    // props.put("mail.smtp.starttls.enable", "true"); // 注释掉这行

    // Authentication
    SimpleAuth auth = new SimpleAuth(username, "<你的应用专用密码>");

    // 开启debug方便排查问题(调试完成后再关闭)
    Session session = Session.getInstance(props, auth);
    session.setDebug(true);

    // Message setting
    Message msg = new MimeMessage(session);
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipientEmail));
    msg.setFrom(new InternetAddress(username, "Diego Borba"));
    msg.setSubject("Subject");
    msg.setContent("Text here", "text/plain");

    // 简化Transport使用,自动管理资源
    try (Transport tr = session.getTransport()) {
        tr.connect(smtp, username, "<你的应用专用密码>");
        msg.saveChanges();
        tr.sendMessage(msg, msg.getAllRecipients());
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

关键修改点说明:

  • 删除了props.setProperty("mail.host", "cServSmtp"):这个自定义主机名会覆盖Gmail的SMTP服务器地址,直接导致连接目标错误。
  • 注释掉mail.smtp.starttls.enable:465端口是直接建立SSL连接,而starttls是用于587端口的明文升级TLS流程,两者同时开启会引发协议冲突,导致认证失败。
  • 将mail.smtp.socketFactory.fallback设为false:确保SSL连接失败时不会降级到非加密连接,符合你必须使用SSL的要求。
  • 使用try-with-resources语法自动关闭Transport:避免手动关闭遗漏导致的资源泄漏问题。
  • 开启session.setDebug(true):可以查看SMTP与服务器交互的详细日志,方便后续排查潜在问题。

额外排查点

  • 确认你的JavaMail版本为1.6.2及以上(Java 8兼容的最新稳定版),旧版本可能存在SSL协议支持缺陷。
  • 检查服务器防火墙是否允许对外访问465端口。

内容的提问来源于stack exchange,提问作者Diego Borba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 23:22:55