Spring Boot集成Java Mailer发送邮件时出现连接超时错误求助
Gmail SMTP连接超时问题排查方案
错误回顾
"Mail server connection failed. Failed messages: org.eclipse.angus.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 587; timeout -1;\n nested exception is:\n\tjava.net.ConnectException: Connection timed out: connect".
以下是针对该问题的排查步骤:
1. 网络连通性验证
- 先确认运行环境能访问Gmail的SMTP服务:
- 执行命令测试端口连通性:
telnet smtp.gmail.com 587,如果无法连接,说明存在网络限制。 - 可能原因:本地防火墙拦截、公司网络屏蔽587端口、运营商限制,需联系网络管理员开放端口,或配置代理。
- 若需代理,在
application.yml中添加代理配置:spring: mail: properties: mail.smtp.proxy.host: 代理IP mail.smtp.proxy.port: 代理端口 # 代理需认证时添加 mail.smtp.proxy.user: 代理用户名 mail.smtp.proxy.password: 代理密码
- 执行命令测试端口连通性:
2. Gmail账号权限配置
Gmail对第三方邮件客户端有严格的权限限制,需按以下步骤配置:
- 开启两步验证:进入Google账号安全设置,启用两步验证。
- 创建应用专用密码:两步验证开启后,在安全设置中找到“应用专用密码”,生成一个用于邮件服务的密码,替换配置中的
password字段(原账号密码无法用于第三方客户端)。 - 若未开启两步验证,可尝试临时开启“不太安全的应用访问”(Google已逐步淘汰该选项,优先推荐应用专用密码)。
3. 配置文件修正
检查application.yml的格式与参数:
- 确保配置层级正确,
mail节点属于spring节点,修正后的完整配置:spring: mail: host: smtp.gmail.com username: myemail@gmail.com password: 生成的应用专用密码 port: 587 protocol: smtp properties: mail.transport.protocol: smtp mail.smtp.auth: true mail.smtp.starttls.enable: true # 添加超时配置,避免无限等待 mail.smtp.connectiontimeout: 5000 mail.smtp.timeout: 5000 mail.smtp.writetimeout: 5000 - 移除properties中key的引号,Spring可直接识别无引号的配置项。
4. 代码与注入验证
- 代码逻辑无明显问题,可添加初始化日志确认配置是否正确加载(注意不要打印密码):
@PostConstruct public void verifyMailConfig() { Properties props = _javaMailSender.getJavaMailProperties(); log.info("Loaded SMTP host: {}", props.getProperty("mail.smtp.host")); log.info("Loaded SMTP port: {}", props.getProperty("mail.smtp.port")); log.info("Sender email: {}", sender); } - 确保
JavaMailSender由Spring自动注入,没有自定义配置覆盖默认的邮件发送器。
内容的提问来源于stack exchange,提问作者ushkdn
相关产品推荐
相关产品推荐

