我在使用 Javax 发送邮件时遇到问题。我们使用 gmail 通过 Java 软件发送邮件已有大约 4 年的时间。现在我收到以下错误:
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at SendEmail.sendMissingMailWeek(SendEmail.java:233)
at main.negVerkaeufeMailenWeek(main.java:368)
at main.main(main.java:79)
Caused by: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at SendEmail.sendMissingMailWeek(SendEmail.java:226)
... 2 more
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171)
at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98)
at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:486)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1902)
... 9 more
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
这些是我的 Gmail 设置:
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
props.put("mail.smtp.debug", "true");
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他邮件服务器(O365、Strato)但遇到了相同的错误。
jcc*_*ero 19
该错误表明与邮件服务器建立安全连接所需的 TLS 协议相关的一些问题。
\n正如您在问题评论中看到的,问题可能是由很多不同的原因引起的。在不知道您的操作系统、JDK 和 JavaMail 库版本的情况下,我们只能猜测真正的原因。
\n@g00se 给了你一个很好的建议:请尝试通过提供以下选项来启用 SSL 调试来运行你的程序:
\n-Djavax.net.debug=all\nRun Code Online (Sandbox Code Playgroud)\n此外,尝试在配置属性中显式包含 TLS 协议,这可能会有所帮助:
\n-Djavax.net.debug=all\nRun Code Online (Sandbox Code Playgroud)\n无论如何,对于您所指出的症状,并且由于 AFAIK Google 最近没有更改任何相关配置,您的问题可能与更改有关有关,以便默认禁用不安全的 TLS 协议版本:
\n\n\nsecurity-libs/javax.net.ssl
\n
\n\xe2\x9e\x9c禁用 TLS 1.0 和 1.1TLS 1.0 和 1.1 是 TLS 协议的版本,\n它们不再被认为是安全的,已被更安全、更现代的\n版本(TLS 1.2 和 1.3)取代。
\n这些版本现在已默认禁用。
\njdk.tls.disabledAlgorithms如果遇到问题,您可以通过从配置文件的安全属性中删除\n“TLSv1”和/或“TLSv1.1”来重新启用这些版本,\n风险由您自己承担java.security。
正如您在bug 描述中所看到的,该更改已向后移植到不同的 JDK 版本。
\n也许您升级了 JDK 并且出现了问题。
\n如果是这种情况,如引用中所示,请尝试编辑您的java.security配置文件TLSv1并TLSv1.1从jdk.tls.disabledAlgorithms。
小智 6
我发现一篇文章有相同的错误消息,但尚未发布:
postfix 和 openJDK 11:“没有合适的协议(协议被禁用或密码套件不合适)”
答案是:
将 JavaMail 从 1.4.7 升级到 1.6.2 后,错误消失了!