首先
outlook邮箱smtp服务器是不支持TLSv1.0、TLSv1.1,所以需要设置TLSv1.2,需加以下代码:
props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
加上后发现这行代码并没有起作用,仍然报错:
javax.mail.AuthenticationFailedException: 550 5.7.67 TLS 1.0 and 1.1 are not supported by your organization. Please contact your administrator. [SG2PR0302CA0011.apcprd03.prod.outlook.com]
或者是:
javax.net.ssl.SSLHandshakeException:No appropriate protocol.
然后继续查找问题,走了很多弯路,有的说是JDK版本的问题,或者设置系统级别的SSL,还有的说是可以关闭SSL。
最后我觉得这种设置不生效的问题还是需要看一下源码,可以找到javax.mail包下的com/sun/mail/util/SocketFetcher.java,直接搜索TLSv1.0,可以看到:
我报错的版本是1.4
SSLSocketFactory ssf = (SSLSocketFactory)SSLSocketFactory.getDefault();
socket = ssf.createSocket(socket, host, port, true);
((SSLSocket)socket).setEnabledProtocols(new String[]{"TLSv1"});
return socket;
一看这里直接设置了TLSv1,所以外部设置根本没用,然后我将版本改成1.4.7
SSLSocket sslsocket = (SSLSocket)socket;
String protocols = props.getProperty(prefix + ".ssl.protocols", (String)null);
if (protocols != null) {
sslsocket.setEnabledProtocols(stringArray(protocols));
} else {
sslsocket.setEnabledProtocols(new String[]{"TLSv1"});
}
重启服务,立即生效,发送邮件畅通无比!
注:baidu不是万能,源码才是尽头。