Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发送电子邮件spring boot时出错:无法将套接字转换为TLS;随机抛出此异常_Java_Spring Boot_Email_Jakarta Mail - Fatal编程技术网

Java 发送电子邮件spring boot时出错:无法将套接字转换为TLS;随机抛出此异常

Java 发送电子邮件spring boot时出错:无法将套接字转换为TLS;随机抛出此异常,java,spring-boot,email,jakarta-mail,Java,Spring Boot,Email,Jakarta Mail,我使用SpringBoot在一天中的特定时间发送电子邮件。我使用Spring调度器实现了这一点。这部分很好用。但在发送电子邮件时,应用程序会随机抛出 邮件服务器连接失败;嵌套异常为javax.mail.MessaginException:无法将套接字转换为TLS 问题是它随机抛出此异常。其他时候,电子邮件发送时没有任何问题。 一旦它开始抛出异常,我就会重新启动服务器。一旦应用程序移动到Prod,我就不能这样做。我知道连接参数和属性是正确的,因为电子邮件正在发送。有人知道为什么会这样吗 下面是我使

我使用SpringBoot在一天中的特定时间发送电子邮件。我使用Spring调度器实现了这一点。这部分很好用。但在发送电子邮件时,应用程序会随机抛出 邮件服务器连接失败;嵌套异常为javax.mail.MessaginException:无法将套接字转换为TLS

问题是它随机抛出此异常。其他时候,电子邮件发送时没有任何问题。 一旦它开始抛出异常,我就会重新启动服务器。一旦应用程序移动到Prod,我就不能这样做。我知道连接参数和属性是正确的,因为电子邮件正在发送。有人知道为什么会这样吗

下面是我使用的spring引导配置

spring.mail.host=relay.xx.org
spring.mail.port=25
spring.mail.username=prabu.alias@mydomain.org
spring.mail.password=xxxxx
spring.mail.properties.mail.smtp.auth=localhost
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtps.trust=*
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.writetimeout=5000
发送电子邮件的代码

    SimpleMailMessage msg = new SimpleMailMessage();
    msg.setFrom(FROM_ADDRESS);
    msg.setTo(TO_ADDRESS);
    msg.setSubject("Test email ");
    msg.setText("This is a Test email generated at 5 PM." );
    javaMailSender.send(msg);
下面是异常跟踪

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. Failed messages: javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:446) ~[spring-context-support-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:321) ~[spring-context-support-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:310) ~[spring-context-support-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.ms.DmhThymeLeaf.utility.EmailScheduler.sendEmailActual(EmailScheduler.java:81) ~[classes/:na]
    at org.ms.DmhThymeLeaf.utility.EmailScheduler.cornJobSchedulerActual(EmailScheduler.java:65) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_91]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_91]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_91]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
Caused by: javax.mail.MessagingException: Could not convert socket to TLS
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2155) ~[javax.mail-1.6.1.jar:1.6.1]
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:752) ~[javax.mail-1.6.1.jar:1.6.1]
    at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.6.1.jar:1.6.1]
    at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:515) ~[spring-context-support-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:435) ~[spring-context-support-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    ... 18 common frames omitted
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) ~[na:1.8.0_91]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) ~[na:1.8.0_91]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) ~[na:1.8.0_91]
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) ~[na:1.8.0_91]
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) ~[na:1.8.0_91]
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) ~[na:1.8.0_91]
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_91]
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:620) ~[javax.mail-1.6.1.jar:1.6.1]
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:547) ~[javax.mail-1.6.1.jar:1.6.1]
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2150) ~[javax.mail-1.6.1.jar:1.6.1]
    ... 22 common frames omitted

程序是否每次都在同一台机器上运行?如果您运行在某种云或集群环境中,有时会遇到不同的机器,那么可能有一台机器的JDK配置不好。另外,我假设您的服务器使用的是具有公共信任路径的证书,并且您不需要将特殊证书加载到应用程序中以使其与服务器一起工作。它不在云或群集环境中。它每次都在同一台机器上运行。目前没有特殊证书,我也没有使用任何证书。但我打算稍后使用自签名证书,因为此应用程序将在内部使用。我不确定,但这行可能不起作用。spring.mail.properties.mail.smtps.trust=*。使用spring.mail.properties.mail.smtp.starttls.required=true或直接放置在properties Objective中的邮件.smtp.ssl.trust=*尝试此操作。如果您的服务器具有公开签名和验证的证书,则不需要设置trust属性。我不知道Spring是否将该属性传递给JavaMail。但是属性设置的任何问题每次都会失败,所以这并不能解释您看到了什么。您是否有防火墙或防病毒程序介入您与服务器的通信?这可能是你问题的根源。我也认为这可能是防火墙问题或电子邮件服务器端的问题,但如果在异常之后出现这种情况,应用程序应该能够稍后发送电子邮件。但它一直抛出异常,直到我重新启动。所以有点不确定这是什么原因。但是现在,如果异常发生在sendmail()上,我将调用另一个方法,该方法将创建一个Properties对象并设置所有值,并使用java mail api发送电子邮件。在这里,我创建了mailssocketfactory的对象,并将trustallhosts设置为true。