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

