使用JavaMail API发送邮件遇SocketTimeoutException问题求助
JavaMail发送Gmail遇SocketTimeoutException排查解决
1. 代码冗余与注释错误
- 重复设置了
mail.smtp.auth,删掉其中一行即可,属于冗余代码不影响功能但建议清理。 - 超时时间注释有误:
50000对应的是50秒,不是注释里标注的5秒,若需5秒超时请改为5000。
2. Gmail账号认证必做配置
Gmail对第三方客户端登录有严格限制,必须满足以下条件之一:
- 账号开启两步验证:使用应用专用密码(App Password)替代原密码登录,原密码无法用于SMTP验证。
- 未开启两步验证:在Google账号设置中开启“不太安全的应用访问”(注:Google已逐步淘汰该选项,优先推荐两步验证+应用密码方案)。
3. 补充JavaMail关键配置
添加以下配置项优化SMTP连接稳定性:
// 信任Gmail SMTP服务器证书,避免SSL验证问题 properties.put("mail.smtp.ssl.trust", "smtp.gmail.com"); // 强制要求STARTTLS加密 properties.put("mail.smtp.starttls.required", "true"); // 增加写入超时配置,覆盖默认值 properties.put("mail.smtp.writetimeout", "50000");
4. 修正Transport连接逻辑
当前transport.connect()未传参,建议显式指定连接参数,确保逻辑清晰:
transport.connect("smtp.gmail.com", 587, username, password);
5. 网络环境排查
- 用
telnet smtp.gmail.com 587测试端口连通性,若无法连接,说明防火墙、代理拦截了587端口的出站请求,需联系网络管理员调整。 - 国内环境需通过合规网络访问Gmail服务。
6. 依赖简化(可选)
你引入的commons-email是JavaMail的封装层,若直接使用JavaMail API,可暂时移除该依赖,排除兼容性干扰。
内容的提问来源于stack exchange,提问作者Jemie
相关产品推荐
相关产品推荐

