记录javax.mail整合outlook邮箱遇到的一个问题

首先
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不是万能,源码才是尽头。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容