无需启用低安全应用访问解决javax.mail.AuthenticationFailedException报错
问题修复可行方案
javax.mail.AuthenticationFailedException报错的核心原因是2022年5月30日起谷歌正式停用低安全性应用访问权限,不再支持直接使用Google账号登录密码通过第三方SMTP客户端发信,以下是三种可直接落地的Java发信实现方案:
方案1:使用Gmail应用专用密码(改造成本最低)
该方案不需要修改原有JavaMail代码逻辑,仅需替换认证密码即可,前提是你的Google账号已开启两步验证:
- 登录Google账号进入安全设置页,找到「应用专用密码」配置入口
- 应用类型选择「邮件」,设备选择当前程序运行的对应环境,生成16位长度的应用专用密码
- 代码中原先填写Google账号登录密码的位置,替换为这串16位应用专用密码即可
核心配置参考:
import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; import java.util.Properties; public class GmailSendDemo { public static void main(String[] args) { 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"); // 若使用JDK17+建议升级到jakarta.mail依赖,避免TLS版本兼容问题 Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 用户名必须填完整Gmail地址,密码填16位应用专用密码,*不要填账号登录密码* return new PasswordAuthentication("your_address@gmail.com", "xxxxyyyyzzzzwwww"); } }); // 后续邮件构造、发送逻辑和原有代码完全一致 } }
如果替换后仍报认证错误,优先排查:
- 确认应用专用密码复制时没有多余空格、换行
- 确认本地/服务器网络可以正常连通smtp.gmail.com的587端口,无防火墙、网络策略拦截
- 确认账号两步验证状态正常,没有主动撤销已生成的应用专用密码
方案2:对接Gmail API走OAuth2.0授权(安全性最高)
如果账号无法开启两步验证,或者有更高的安全合规要求,可以放弃SMTP协议,直接对接Gmail官方API通过OAuth2.0授权发信:
- 在Google云平台创建项目,启用Gmail API服务
- 配置OAuth2.0同意屏,创建桌面端/服务端类型的OAuth2.0凭证,获取客户端ID、密钥
- 完成账号授权,获取对应发信权限的访问令牌
- Java端引入Gmail API官方Java依赖,通过访问令牌构建认证客户端,调用发信接口即可
该方案全程不需要传递账号密码,不会触发密码类认证失败问题,缺点是前期配置流程相对繁琐。
方案3:换用其他支持标准SMTP的邮件服务(配置成本最低)
如果不想处理Gmail的复杂权限配置,可以直接替换为支持标准SMTP认证的其他邮箱服务(包括个人邮箱、企业邮箱、专业邮件推送服务):
- 进入对应邮箱的设置页,开启SMTP服务,获取服务给出的SMTP服务器地址、端口、专用授权码
- 替换原有JavaMail代码中的SMTP连接参数,认证时用户名填对应邮箱地址,密码填服务生成的专用授权码即可
原有发信逻辑基本不需要改动,大部分邮件服务的SMTP鉴权逻辑兼容性更好,不容易出现认证失败问题。
内容的提问来源于stack exchange,提问作者Nam Can
相关产品推荐
相关产品推荐

