Spring Boot连接Yahoo SMTP服务器超时问题求助
Spring Boot 连接Yahoo SMTP服务器超时排查与解决
问题详情
Spring Boot项目中配置smtp.mail.yahoo.com的587端口发送邮件,当前持续出现连接超时错误。该功能半年前可正常运行,已尝试调整配置、更换依赖,但问题未解决。
报错日志
[http-nio-8081-exec-2] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.mail.MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.mail.yahoo.com, 587; timeout -1; nested exception is: java.net.ConnectException: Connection timed out: connect. Failed messages: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.mail.yahoo.com, 587; timeout -1; nested exception is: java.net.ConnectException: Connection timed out: connect; message exceptions (1) are: Failed message 1: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.mail.yahoo.com, 587; timeout -1; nested exception is: java.net.ConnectException: Connection timed out: connect] with root cause java.net.ConnectException: Connection timed out: connect at java.base/sun.nio.ch.Net.connect0(Native Method) at java.base/sun.nio.ch.Net.connect(Net.java:579) at java.base/sun.nio.ch.Net.connect(Net.java:568) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at java.base/java.net.Socket.connect(Socket.java:583) at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:335) ... at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833)
相关代码
邮件发送方法
@Autowired JavaMailSender mailSender; public void sendNewPasswordEmail(String firstName, String password, String email) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("noreply@baeldung.com"); message.setTo(email); message.setSubject(EMAIL_SUBJECT); message.setText("Hello " + firstName + ", \n\n Your new account password is: " + password + "\n\n The Support Team"); mailSender.send(message); }
邮件配置Bean
@Bean public JavaMailSender mailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.mail.yahoo.com"); mailSender.setPort(587); mailSender.setUsername(USERNAME); mailSender.setPassword(PASSWORD); return mailSender; }
解决步骤
确认Yahoo SMTP最新配置
Yahoo邮箱的SMTP配置可能有更新,当前官方要求:- 服务器地址:
smtp.mail.yahoo.com - 端口:587(需启用TLS)或465(SSL加密)
- 认证:必须开启
- 密码:若邮箱开启了两步验证,必须使用应用专用密码,不能用原邮箱登录密码。可在Yahoo账户安全设置中生成应用专用密码。
- 服务器地址:
补全邮件会话属性配置
现有配置缺少TLS启用等关键属性,修改配置Bean:@Bean public JavaMailSender mailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.mail.yahoo.com"); mailSender.setPort(587); mailSender.setUsername(USERNAME); mailSender.setPassword(PASSWORD); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.debug", "true"); // 开启调试,方便查看连接细节 return mailSender; }排查网络连通性
- 用
telnet smtp.mail.yahoo.com 587测试端口连通性,若无法连接,说明防火墙、代理或运营商屏蔽了该端口,需调整网络规则或更换端口(比如465)。 - 若使用代理服务器,需在Java邮件配置中添加代理属性,或确保代理允许访问目标SMTP服务器。
- 用
检查依赖兼容性
- 若使用Spring Boot 3.x,需使用Jakarta Mail依赖,而非旧的javax.mail。确保
spring-boot-starter-mail版本与Spring Boot版本匹配,避免依赖冲突。
- 若使用Spring Boot 3.x,需使用Jakarta Mail依赖,而非旧的javax.mail。确保
内容的提问来源于stack exchange,提问作者Dadzio008
相关产品推荐
相关产品推荐

