您的位置:首页 > 编程语言 > Java开发

javamail 调用office365的邮箱发送邮件----报错到成功问题记录

2016-04-13 14:50 489 查看
发送邮件的时候首先报错ssl shakehands失败,报错没有找到可用的证书,网上搜到相关的靠谱的方案是

MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
}
sf.setTrustAllHosts(true);
//        pro.put("mail.smtp.ssl.enable", "true");
//        pro.put("mail.smtp.ssl.trust", "*");     // 不影响
pro.put("mail.smtp.ssl.socketFactory", sf); //这句加上后才发送成功,不加的话就发送不成功
pro.put("mail.smtp.socketFactory.fallback", "false");


不过设置了这个之后发现并不能够发送成功,后来联系365offic的工作人员,提到证书的时候他们说他们是有个证书的,发过来了一个,然而安装后也并没有用。

后来网上搜到通过InstallCert.java来从服务器上下载证书,下载的过程是编译InstallCert.java文件,然后运行java InstallCert SMTP.partner.outlook.cn:587 会提示server发送过来几个证书,输入选项下载对应的证书。

根据这个方法下载证书的时候,发现会有报错如下:

javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1844)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1827)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1346)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at org.vangen.auth.InstallCert.main(InstallCert.java:81)
Caused by: java.lang.UnsupportedOperationException
at org.vangen.auth.InstallCert$SavingTrustManager.getAcceptedIssuers(InstallCert.java:168)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAlgorithmConstraints(SSLContextImpl.java:926)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:872)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:814)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
... 2 more
后来搜到/article/2185142.html这里说名是要使用1.5或者1.6的jdk才可以,1.7的就会报错这个,换用1.6的jdk后果然就不再报错这个了。但是还会继续报错
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM

at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2249)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1740)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1239)
at javax.mail.Transport.send0(Transport.java:255)
at javax.mail.Transport.send(Transport.java:124)
at com.pello.mail.SimpleMailSender.sendTextMail(SimpleMailSender.java:80)
at com.pello.mail.SendMailDemo.main(SendMailDemo.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

然后调试的时候发现是没有开启tls,开启后就发送成功了。

这个时候的我就发现比较神奇了,难道真的是下载下来的证书才可以,开启了各种调试模式,最终发现并不是下载下来的证书有什么用,而是我为了下载证书,把jdk换成了1.6版本的原因,我之前添加设置的时候由于jdk是1.7的,所以没有发送成功。

最终的结果就是,原来就是最开始加的那部分设置就可以了,不过在jdk1.7下不行,要在jdk1.6下才可以,这真是一个忧伤的故事。

不管如何,问题搞定了,网上也搜了很多,完全没有看到有关提到jdk版本的说明,这里做个记录吧。

InstallCert.java文件见附件。

把本地调试的发邮件的代码也附件传一下吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: