无法发送邮件-javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?
我们正在使用SpringJavaMailSenderImpl发送邮件。以下是配置无法发送邮件-javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?,java,spring,ssl,jakarta-mail,Java,Spring,Ssl,Jakarta Mail,我们正在使用SpringJavaMailSenderImpl发送邮件。以下是配置 ${mail.transport.protocol} ${mail.smtp.auth} ${mail.smtp.starttls.enable} 假的 真的 属性文件:- host=XXXX.XXXX.XX 端口=25 mail.username=xxxxxxxx mail.password=xxxxxxx mail.transport.protocol=smtp mail.smtp.auth=true ma
${mail.transport.protocol}
${mail.smtp.auth}
${mail.smtp.starttls.enable}
假的
真的
属性文件:-
host=XXXX.XXXX.XX
端口=25
mail.username=xxxxxxxx
mail.password=xxxxxxx
mail.transport.protocol=smtp
mail.smtp.auth=true
mail.smtp.starttls.enable=true
控制台日志
线程“taskExecutor-2”org.springframework.mail.MailSendException中出现异常:邮件服务器连接失败;嵌套异常为javax.mail.MessaginException:无法连接到SMTP主机:XXXX.XXXX.XX,端口:25;
嵌套异常是:
javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?。失败的邮件:javax.mail.MessaginException:无法连接到SMTP主机:XXXX.XXXX.XX,端口:25;
嵌套异常是:
javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?;消息异常详细信息(1)包括:
失败消息1:
javax.mail.MessaginException:无法连接到SMTP主机:XXXX.XXXX.XX,端口:25;
嵌套异常是:
javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?
在com.sun.mail.smtp.SMTPTransport.openServer上(SMTPTransport.java:1934)
在com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)上
在javax.mail.Service.connect(Service.java:295)
位于org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
位于org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
位于org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336)
在com.XXXX.Mailer$1.run(Mailer.java:52)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:744)
原因:javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?
位于sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:671)
位于sun.security.ssl.InputRecord.read(InputRecord.java:504)
位于sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
位于sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
位于sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
位于com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
位于com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
在com.sun.mail.smtp.SMTPTransport.openServer上(SMTPTransport.java:1900)
... 9更多
我们确信这与SSL证书无关,因为在同一台服务器上部署了其他web应用程序,它们使用相同的配置发送电子邮件。这里可能有什么问题?${mail.smtp.starttls.enable}
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.ssl.enable">true</prop>
真的
您需要在TCP连接(端口465)之后直接为隐式ssl启用mail.smtp.ssl.enable
,或者使用starttls命令(端口25)为显式ssl启用mail.smtp.starttls.enable
。但使用当前属性,您将两者都设置为true
这意味着它将进行TCP连接到端口25,并在那里尝试SSL握手。这将失败,因为服务器正在从SMTP对话框发送纯文本问候语,而不是预期的SSL握手。这样你就得到了
无法识别的SSL消息,纯文本连接
要解决此问题,请确保使用隐式或显式SSL,但不能同时使用这两种SSL,具体取决于端口,即,对于端口25
mail.smtp.SSL.enable
,应为false。我尝试通过多种方法解决此问题,但最终发现自己可以解决此问题
mail.smtp.host=<myhostname.com>
mail.smtp.port=25
mail.smtp.auth=true
mail.transport.protocol=smtp
smtpd_recipient_restrictions=permit_sasl_authenticated
user=<sender_username/email>
password=<password>
mail.smtp.username=<sender_username/email>
mail.smtp.password=<password>
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
您确定配置正确吗?SMTP SSL端口通常不是25,更像465Positive。同一服务器中的不同应用程序具有相同的配置并可以发送电子邮件。我投票重新打开此问题,因为链接的问题涉及HTTPs与HTTP,而不像OP那样涉及SMTPS与SMTPhere@StefanHaberl在我看来,根本原因可能与此类似——此错误不是特定于HTTP/SMTP协议的,但是对于HTTPS和SMTPS共享的SSL协议,@OctaviaTogami是的,这是相同的原因。但是,您必须为HTTP和SMTP设置不同的属性才能使其工作。我将尝试此方法。但令人困惑的是,我们已经在同一个tomcat服务器中的不同应用程序中启用了这两个选项,邮件工作正常。这里有什么东西可以使它特定于tomcat中部署的应用程序吗?@ArunM:我的猜测是,如果隐式TLS已经完成,它将不会尝试显式TLS(STARTTLS),因为在TLS中执行TLS没有意义。这意味着,如果
mail.smtp.ssl.enable
为true,则mail.smtp.starttls.enable
将被隐式忽略,因此任何与端口465(smtps)的连接都应该正常工作。
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;