猿问

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

我已经研究了该主题几天,但我在网上找到的答案都没有对我有用。


上下文:我有一个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.2

Java代码中许多地方的更改,以适应此升级并在应用程序的其他部分中添加功能

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.com

FT_MAIL_SMTP_PORT=587

FT_MAIL_SMTP_USERNAME=myaccount@myapp.com

FT_MAIL_SMTP_PASSWORD=mypassword


FT_MAIL_SMTP_STARTTLS=true

FT_MAIL_SMTP_TLSREQUIRED=true

FT_MAIL_SMTP_AUTH=true

FT_MAIL_SMTP_CONN_TIMEOUT=5000

FT_MAIL_SMTP_TIMEOUT=5000

FT_MAIL_SMTP_WRITE_TIMEOUT=5000

我尝试设置不正确的SMTP服务器或错误的凭据,这使连接失败,因此我认为服务器和凭据是正确的,并且在成功连接后会发生错误。

所使用的帐户尚未达到上限,因为另一个VM使用相同的凭据并可以毫无问题地发送电子邮件。

我尝试将“启动TLS”设置更改为false,而改用端口465,但这也不起作用。


www说
浏览 383回答 2
2回答

叮当猫咪

在对配置进行了多次尝试和错误之后,我发现它在配置中需要一个应用程序属性“ spring.mail.protocol”。我已经protocol: smtp在application.yml中添加了这一行:spring:&nbsp; mail:&nbsp; &nbsp; protocol: smtp这样就解决了读取超时问题,现在可以正确发送电子邮件了。希望将来对某人有帮助。

杨魅力

我确实遇到过同样的问题,但是我的情况有点不同我试图使用石英表以预定的方式发送当我不使用Quartz时,一切正常,但是使用石英时,它开始出现故障上面的解决方案对我没有帮助,但是使我了解了我设置的属性。增加连接超时对我有用从而改变了应用程序的属性从:spring.mail.properties.mail.smtp.timeout=3000至:spring.mail.properties.mail.smtp.timeout=25000希望它也对其他人有用
随时随地看视频慕课网APP

相关分类

Java
我要回答