Java发送邮件时出现"Exception reading response"错误求助
排查JavaMail "Exception reading response"及后续配置错误的实用思路
这种之前跑的好好的邮件代码突然报通信错误,改完配置还连锁出问题的情况,真的挺闹心的。结合你用的全是1.6.0版本的JavaMail系列依赖,咱们一步步拆解可能的问题:
先搞定最初的「Exception reading response」错误
这个错误本质是客户端和邮件服务器的通信链路断了/不兼容,常见原因有这几个:
- 服务器SSL/TLS协议更新了:JavaMail 1.6.0默认支持的协议范围可能跟不上现在服务器的要求(比如很多服务器已经禁用TLS 1.0/1.1了),你可以显式指定兼容的协议试试,在Session配置里加:
props.put("mail.smtp.ssl.protocols", "TLSv1.2 TLSv1.3"); - 网络被拦截了:防火墙、公司代理可能把邮件端口(25/465/587)封了,或者服务器IP变了你没更新。先手动用
telnet your-smtp-server 587测试下端口能不能连通,排除网络问题。 - 依赖暗戳戳冲突了:虽然你列的都是1.6.0,但难保其他依赖包偷偷引入了旧版本的JavaMail类。用Maven的
mvn dependency:tree或者Gradle的gradle dependencies拉一下依赖树,看看有没有低版本的javax.mail被悄悄带进来,有的话排除掉。
聊聊按@Bill修改后出现的新错误
你没说具体是什么错,但改配置后常见的坑无非这几个:
- 如果是
No appropriate protocol:就是协议不兼容,直接按上面的方法指定TLS 1.2/1.3就行。 - 如果是
AuthenticationFailedException:大概率是邮箱密码/授权码过期了,或者服务器开了两步验证,得用应用专用密码登录,而不是你平时的登录密码。
移除SSL属性后又出问题?那是配置方向错了
移除SSL后如果报530 Must issue a STARTTLS command first,说明服务器要求加密连接但不是直接SSL直连,你应该开STARTTLS而不是直接关掉所有加密配置:
props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.starttls.required", "true");
要是报Connection refused,那就是服务器完全不允许裸连,必须用SSL端口(比如465),那还是得把SSL相关配置加回去。
最后给个终极排查技巧:开Debug日志
JavaMail的debug日志能把客户端和服务器的每一句交互都打出来,简直是排查通信问题的神器。在Session配置里加一行:
props.put("mail.debug", "true");
日志里会显示EHLO、AUTH、STARTTLS这些指令的服务器返回码,一看就知道是哪一步卡壳了——比如服务器返回550就是发件被拒,535就是认证失败,比模糊的异常信息有用多了。
另外也别忘了检查邮箱账号状态:有没有被服务器封禁、异地登录触发保护、发件频率超限?这些都会导致通信异常。
内容的提问来源于stack exchange,提问作者megueloby
相关产品推荐
相关产品推荐

