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

