当前位置: 首页 > 知识库问答 >
问题:

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

黄逸清
2023-03-14

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

上下文:我有一个Spring Boot Web应用程序,它使用JavaMail API和Spring Boot Starter Mail发送自动电子邮件通知。

它使用谷歌办公套件帐户的GMail SMTP服务器。我最近升级到使用Spring 5.0.6和Spring Boot 2.0.2,电子邮件发送停止工作。

一些线索:

  • 发送电子邮件的Java代码与之前相同

发生了变化的事情:

  • 升级至Spring 5.0.6

以下是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 mail相关的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

以下是用于发送电子邮件的Spring@服务(未更改):

@Service
public class EmailServiceImpl {

@Autowired
public JavaMailSender emailSender;

@Autowired
private SpringTemplateEngine templateEngine;

@Value("${myapp.mail.from}")
private String fromAddress;

@Value("${myapp.mail.replyto}")
private String replyToAddress;

public void sendTemplatedMessage(String template, String to, String subject, Map<String, Object> model) throws MailException, MessagingException {  
    sendTemplatedMessage(template, to, fromAddress, replyToAddress, subject, model);
}

public void sendTemplatedMessage(String template, String to, String from, String subject, Map<String, Object> model) throws MailException, MessagingException { 
    sendTemplatedMessage(template, to, from, replyToAddress, subject, model);
}

private void sendTemplatedMessage(String template, String to, String from, String replyTo, String subject, Map<String, Object> model) throws MailException, MessagingException {    

    MimeMessage message = emailSender.createMimeMessage();

    MimeMessageHelper helper = new MimeMessageHelper(message,
            MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
            StandardCharsets.UTF_8.name());

    //helper.addAttachment("logo.png", new ClassPathResource("memorynotfound-logo.png"));
    Context context = new Context();
    context.setVariables(model);
    String html = templateEngine.process(template, context);

    helper.setTo(to);
    helper.setFrom(from);
    helper.setReplyTo(from);
    helper.setSubject(subject);
    helper.setText(html, true);

    emailSender.send(message);
}

public void sendSimpleMessage(String to, String from, String subject, String text) {
    try {           
        SimpleMailMessage message = new SimpleMailMessage(); 
        message.setTo(to);
        message.setFrom(from);
        message.setSubject(subject); 
        message.setText(text);
        emailSender.send(message);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

下面是我在尝试发送电子邮件时遇到的错误:

04:42:19.900 [https-jsse-nio-443-exec-3] ERROR c.f.controller.StayController - Could not send Guest confirmation email to gfgorostidi@protonmail.com
org.springframework.mail.MailSendException: Failed to close server connection after message sending; nested exception is javax.mail.MessagingException: Exception reading response;
  nested exception is:
 java.net.SocketTimeoutException: Read timed out
 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:482)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:359)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:354)
 at com.myapp.util.EmailServiceImpl.sendTemplatedMessage(EmailServiceImpl.java:61)
 at com.myapp.util.EmailServiceImpl.sendTemplatedMessage(EmailServiceImpl.java:35)
 at com.myapp.controller.StayController.sendConfirmEmailToGuest(StayController.java:437)
 at com.myapp.controller.StayController.saveStay(StayController.java:383)
 at com.myapp.controller.StayController.createStay(StayController.java:163)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 ......
 ......
 ......
 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: javax.mail.MessagingException: Exception reading response;
  nested exception is:
 java.net.SocketTimeoutException: Read timed out
 at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2202)
 at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1212)
 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:473)
 ... 104 more
Caused by: java.net.SocketTimeoutException: Read timed out
 at java.base/java.net.SocketInputStream.socketRead0(Native Method)
 at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:171)
 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:141)
 at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:425)
 at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:65)
 at java.base/sun.security.ssl.SSLSocketImpl.bytesInCompletePacket(SSLSocketImpl.java:918)
 at java.base/sun.security.ssl.AppInputStream.read(AppInputStream.java:144)
 at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
 at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252)
 at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:271)
 at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89)
 at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2182)
 ... 106 more
org.springframework.mail.MailSendException: Failed to close server connection after message sending; nested exception is javax.mail.MessagingException: Exception reading response;
  nested exception is:
 java.net.SocketTimeoutException: Read timed out
 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:482)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:359)
 at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:354)
 at com.myapp.util.EmailServiceImpl.sendTemplatedMessage(EmailServiceImpl.java:61)
 at com.myapp.util.EmailServiceImpl.sendTemplatedMessage(EmailServiceImpl.java:35)
 at com.myapp.controller.StayController.sendConfirmEmailToGuest(StayController.java:437)
 at com.myapp.controller.StayController.saveStay(StayController.java:383)
 at com.myapp.controller.StayController.createStay(StayController.java:163)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 ......
 ......
 ......
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: javax.mail.MessagingException: Exception reading response;
  nested exception is:
 java.net.SocketTimeoutException: Read timed out
 at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2202)
 at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1212)
 at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:473)
 ... 104 more
Caused by: java.net.SocketTimeoutException: Read timed out
 at java.base/java.net.SocketInputStream.socketRead0(Native Method)
 at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:171)
 at java.base/java.net.SocketInputStream.read(SocketInputStream.java:141)
 at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:425)
 at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:65)
 at java.base/sun.security.ssl.SSLSocketImpl.bytesInCompletePacket(SSLSocketImpl.java:918)
 at java.base/sun.security.ssl.AppInputStream.read(AppInputStream.java:144)
 at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
 at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252)
 at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:271)
 at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89)
 at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2182)
 ... 106 more

我试图设置错误的SMTP服务器或错误的凭据,这导致连接失败,因此我假设服务器和凭据是正确的,并且错误发生在成功连接之后。

由于另一个虚拟机使用相同的凭据并发送电子邮件,因此使用的帐户尚未达到其限制。

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

感谢您的帮助!!提前谢谢!

共有2个答案

越朗
2023-03-14

我确实面临同样的问题,但我的情况有点不同

我试着用quartz按时间表发送

当我不使用石英它是所有工作正常但与石英它开始失败

上述解决方案对我没有帮助,但为我指明了查看已设置属性的方向。

增加连接超时完成了我的工作

因此更改了应用程序属性

发件人:

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

致:

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

希望它对其他人也有效

漆雕疏珂
2023-03-14

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

我在应用程序中添加了行协议:smtp。yml:

spring:
  mail:
    protocol: smtp

修复了读取超时问题,电子邮件现在可以正常发送了。希望将来能对某人有所帮助。

 类似资料:
  • 问题内容: 这是一个基于客户端/服务器的简单ping / pong程序。不幸的是,IT无法正常工作并显示以下错误消息: 它停止在CLIENT TASK 30行,实际上,客户端不读取服务器已发送的内容。这里的代码: 服务器 服务器任务 客户 客户任务 问题答案: 问题出在循环内部的使用与从连接另一端处理套接字的方式之间的交互。 仅当从其读取的流结束时才返回-1,这在本质上将意味着套接字已关闭。在关闭

  • 问题内容: 我正在使用sendgrid发送电子邮件,并且使用以下代码可以正常工作,但没有附件。 但是我需要发送附件,因此我搜索了github源和Web文档API,由于某种原因,没有javadocs,但是有一个示例GitHub sendgrid, 所以我一直在尝试直到它起作用为止,我缩小了一些异常和响应代码,起初我是被禁止的未经授权,最好是响应202,表示有效且已排队(在此处检查),这是我的代码发送

  • 问题内容: 在Swift 的正常情况下,我使用此代码发送邮件。 如何在SwiftUI中实现相同目标? 我需要使用吗? 问题答案: 如前所述,您需要将组件移植到via 。 这是一个简单的实现: 用法 : (在运行iOS 13的iPhone 7 Plus上进行了测试-就像一个护身符) 为Xcode 11.4更新

  • 主要内容:SmtpClient类,示例VB.Net应用程序可发送电子邮件。名称空间包含用于向简单邮件传输协议(SMTP)服务器发送电子邮件以供传送的类。 下表列出了一些常用的类: 编号 类 描述 1 代表电子邮件的附件。 2 将附件存储为电子邮件的一部分。 3 代表电子邮件发件人或收件人的地址。 4 存储与电子邮件关联的电子邮件地址。 5 表示可以使用类发送的电子邮件。 6 允许应用程序使用简单邮件传输协议(SMTP)发送电子邮件。

  • 主要内容:使用 CDOSYS 发送电子邮件,CDONTs 怎么样?,使用 CDOSYS 的实例CDOSYS 是 ASP 中的内建组件。此组件用于通过 ASP 发送电子邮件。 使用 CDOSYS 发送电子邮件 CDO (Collaboration Data Objects) 是一项微软的技术,设计目的是用来简化通讯应用程序的创建。 CDOSYS 是 ASP 中的内建组件。我们将向您演示如何通过 ASP 使用该组件来发送电子邮件。 CDONTs 怎么样? 微软已经在 Windows 2000、

  • 问题内容: 但是我已经尝试了一天多了,以获取与Django一起使用的电子邮件。 我收到此错误消息:当我尝试发送电子邮件时 这是我创建电子邮件并尝试在其视图中发送的地方: 我的设置文件如下: 我尝试过使用进行测试发送python -m smtpd -n -c DebuggingServer localhost:1025并获得了成功,但是当最终归结为真正却没有成功时。 当我尝试从外壳执行send_ma