Java Spring邮件程序连接smtp.gmail.com:587报权限拒绝错误如何解决
排查与解决方案
错误java.net.SocketException: Permission denied: connect本质是出问题的机器上Java进程无法建立到smtp.gmail.com:587的TCP连接,可按以下顺序排查解决:
排查步骤
- 先验证底层网络连通性
在出问题的机器上执行端口连通性测试:
Windows系统PowerShell执行:Test-NetConnection smtp.gmail.com -Port 587
macOS/Linux终端执行:telnet smtp.gmail.com 587或nc -zv smtp.gmail.com 587
如果测试返回连接失败,说明是网络层面被拦截,和代码无关。 - 检查本地防火墙/安全软件规则
确认Windows Defender防火墙、macOS防火墙、Linux iptables/ufw,或者第三方杀毒、终端安全软件是否拦截了Java进程的出站请求,或者禁止了对外587端口的访问。可以临时关闭对应安全软件重试,验证是否是拦截导致。 - 核对代理配置
确认出问题的机器是否配置了全局代理,而Java进程没有同步配置代理规则导致无法连接公网SMTP服务器。 - 检查IPv6适配问题
部分Java版本默认优先使用IPv6协议,如果当前网络环境不支持IPv6连接Gmail服务器,也会抛出权限拒绝错误。
对应解决方法
- 网络层面拦截的情况:如果是公司/学校内网、运营商封禁了587端口,可以换用Gmail SMTP的SSL 465端口,调整代码配置如下:
Properties props = new Properties(); props.put("mail.smtp.starttls.enable", "true"); // 新增SSL配置 props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); String host = "smtp.gmail.com"; int port = 465; // 端口改为465 // 其余原有代码保持不变 - IPv6适配问题:启动Java程序时添加JVM启动参数强制使用IPv4:
-Djava.net.preferIPv4Stack=true,也可以在代码执行初始化前添加配置:System.setProperty("java.net.preferIPv4Stack", "true"); - 代理场景:如果必须使用代理访问公网,添加JVM代理启动参数即可:
-Dhttp.proxyHost=你的代理地址 -Dhttp.proxyPort=代理端口 -Dhttps.proxyHost=你的代理地址 -Dhttps.proxyPort=代理端口 - 防火墙/安全软件拦截:将Java进程或者587、465端口的出站规则加入白名单即可。
内容的提问来源于stack exchange,提问作者Hrishikesh Shinde
相关产品推荐
相关产品推荐

