为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot电子邮件发送引发SocketTimeoutException:读取超时

Spring Boot电子邮件发送引发SocketTimeoutException:读取超时

www说 2021-04-07 14:11:33
我已经研究了该主题几天,但我在网上找到的答案都没有对我有用。上下文:我有一个Spring Boot Web应用程序,该应用程序使用Java Mail API和Spring Boot Starter Mail发送自动电子邮件通知。它使用带有GSuite帐户的GMail SMTP服务器。我最近升级为使用Spring 5.0.6和Spring Boot 2.0.2,并且电子邮件发送停止了工作。一些线索:发送电子邮件的Java代码与以前相同Gmail SMTP仍然可以正常工作(从另一台使用旧版应用程序且具有相同设置和身份验证的VM,可以正确发送电子邮件)。除非我丢失了某些内容,否则应用程序配置与以前相同发生了变化的事情:升级到Spring 5.0.6升级到Spring Boot 2.0.2Java代码中许多地方的更改,以适应此升级并在应用程序的其他部分中添加功能VM的IP地址与以前不同(AWS EC2实例)以下是pom.xml中的相关依赖项:    <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->    <dependency>        <groupId>javax.mail</groupId>        <artifactId>javax.mail-api</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-mail</artifactId>    </dependency>这是与Spring邮件相关的application.yml:spring:  mail:    host: ${FT_MAIL_SMTP_HOST}     port: ${FT_MAIL_SMTP_PORT}     username: ${FT_MAIL_SMTP_USERNAME}     password: ${FT_MAIL_SMTP_PASSWORD}     debug: false     properties:       mail:         smtp:           starttls:             enable: ${FT_MAIL_SMTP_STARTTLS}             required: ${FT_MAIL_SMTP_TLSREQUIRED}           auth: ${FT_MAIL_SMTP_AUTH}           connectiontimeout: ${FT_MAIL_SMTP_CONN_TIMEOUT}           timeout: ${FT_MAIL_SMTP_TIMEOUT}           writetimeout: ${FT_MAIL_SMTP_WRITE_TIMEOUT}这些变量在环境中定义:FT_MAIL_SMTP_HOST=smtp.gmail.comFT_MAIL_SMTP_PORT=587FT_MAIL_SMTP_USERNAME=myaccount@myapp.comFT_MAIL_SMTP_PASSWORD=mypasswordFT_MAIL_SMTP_STARTTLS=trueFT_MAIL_SMTP_TLSREQUIRED=trueFT_MAIL_SMTP_AUTH=trueFT_MAIL_SMTP_CONN_TIMEOUT=5000FT_MAIL_SMTP_TIMEOUT=5000FT_MAIL_SMTP_WRITE_TIMEOUT=5000我尝试设置不正确的SMTP服务器或错误的凭据,这使连接失败,因此我认为服务器和凭据是正确的,并且在成功连接后会发生错误。所使用的帐户尚未达到上限,因为另一个VM使用相同的凭据并可以毫无问题地发送电子邮件。我尝试将“启动TLS”设置更改为false,而改用端口465,但这也不起作用。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

在对配置进行了多次尝试和错误之后,我发现它在配置中需要一个应用程序属性“ spring.mail.protocol”。


我已经protocol: smtp在application.yml中添加了这一行:


spring:

  mail:

    protocol: smtp

这样就解决了读取超时问题,现在可以正确发送电子邮件了。希望将来对某人有帮助。


查看完整回答
反对 回复 2021-04-21
?
杨魅力

TA贡献1811条经验 获得超6个赞

我确实遇到过同样的问题,但是我的情况有点不同

我试图使用石英表以预定的方式发送

当我不使用Quartz时,一切正常,但是使用石英时,它开始出现故障

上面的解决方案对我没有帮助,但是使我了解了我设置的属性。

增加连接超时对我有用

从而改变了应用程序的属性

从:

spring.mail.properties.mail.smtp.timeout=3000

至:

spring.mail.properties.mail.smtp.timeout=25000

希望它也对其他人有用


查看完整回答
反对 回复 2021-04-21
  • 2 回答
  • 0 关注
  • 382 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信