无法发送邮件-javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接?

无法发送邮件-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

我们正在使用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
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。

我尝试通过多种方法解决此问题,但最终发现自己可以解决此问题

  • 在创建代码之前,请确保您能够从终端或任何其他邮件客户端发送电子邮件。一旦您的测试邮件工作正常,请使用以下属性和代码。我已经在电子邮件服务器中部署了代码,因此不需要SSL或TLS。我正在使用端口25进行中继

  • 所需财产-

    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;