Spring Boot使用Gmail SMTP发邮件报SocketTimeoutException读取超时求助
问题定位与解决方案
1 基础网络连通性排查
SocketTimeoutException: Read timed out 本质是客户端无法和Gmail SMTP服务器完成正常通信,首先做基础连通性验证:
- 本地执行命令测试端口连通性:
telnet smtp.gmail.com 587,如果连接失败,说明当前网络环境无法访问Google服务,国内环境大概率属于此类情况,可配置网络代理,或更换为国内邮件服务商(QQ邮箱、163邮箱等)。 - 如果telnet可正常连通,再往下排查配置和代码问题。
2 配置项优化
现有application.properties缺少必要配置项,参考以下配置修正:
server.port=80 server.error.include-message=always spring.mail.username=username@gmail.com # 后续需替换为Gmail应用专用密码 spring.mail.password=password spring.mail.default-encoding=UTF-8 spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.protocol=smtp # 开启动时连接测试,方便快速定位问题 spring.mail.test-connection=true spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true # 必须配置发件人,和username保持一致,否则Gmail会直接拒绝请求 spring.mail.properties.mail.smtp.from=username@gmail.com # 延长超时时间,避免默认超时阈值过短导致报错 spring.mail.properties.mail.smtp.connectiontimeout=15000 spring.mail.properties.mail.smtp.timeout=15000 spring.mail.properties.mail.smtp.writetimeout=15000 # 如需走代理访问,放开下方配置替换为自己的代理地址端口 # spring.mail.properties.mail.smtp.proxy.host=127.0.0.1 # spring.mail.properties.mail.smtp.proxy.port=1080
3 Gmail权限配置修正
目前Google已经全面下线「低安全性应用访问」功能,即使之前开启过也已经失效,需改用应用专用密码:
- 先为你的Google账号开启两步验证
- 进入账号安全页创建应用专用密码,将
spring.mail.password的值替换为生成的16位应用专用密码即可。
4 代码补全
现有业务代码未配置发件人,需补充对应配置,修正后代码如下:
@Service public class EmailService { @Autowired JavaMailSender sender; public ApiResponse sendText(String email) { try { SimpleMailMessage mailMessage = new SimpleMailMessage(); // 补充发件人配置,和配置文件中的邮箱保持一致 mailMessage.setFrom("username@gmail.com"); mailMessage.setText("This message from Spring Boot Application"); mailMessage.setSubject("Spring Boot Mail Message"); mailMessage.setTo(email); sender.send(mailMessage); return new ApiResponse("Sent", true); } catch (MailException e) { e.printStackTrace(); return new ApiResponse("Error", false); } } }
根因总结
绝大多数此类报错的核心原因是网络限制无法访问Gmail SMTP服务器,其次是权限配置错误、缺少发件人配置。
内容的提问来源于stack exchange,提问作者GanjaMan
相关产品推荐
相关产品推荐

