javamail 调用office365的邮箱发送邮件----报错到成功问题记录
2016-04-13 14:50
489 查看
发送邮件的时候首先报错ssl shakehands失败,报错没有找到可用的证书,网上搜到相关的靠谱的方案是
不过设置了这个之后发现并不能够发送成功,后来联系365offic的工作人员,提到证书的时候他们说他们是有个证书的,发过来了一个,然而安装后也并没有用。
后来网上搜到通过InstallCert.java来从服务器上下载证书,下载的过程是编译InstallCert.java文件,然后运行java InstallCert SMTP.partner.outlook.cn:587 会提示server发送过来几个证书,输入选项下载对应的证书。
根据这个方法下载证书的时候,发现会有报错如下:
然后调试的时候发现是没有开启tls,开启后就发送成功了。
这个时候的我就发现比较神奇了,难道真的是下载下来的证书才可以,开启了各种调试模式,最终发现并不是下载下来的证书有什么用,而是我为了下载证书,把jdk换成了1.6版本的原因,我之前添加设置的时候由于jdk是1.7的,所以没有发送成功。
最终的结果就是,原来就是最开始加的那部分设置就可以了,不过在jdk1.7下不行,要在jdk1.6下才可以,这真是一个忧伤的故事。
不管如何,问题搞定了,网上也搜了很多,完全没有看到有关提到jdk版本的说明,这里做个记录吧。
InstallCert.java文件见附件。
把本地调试的发邮件的代码也附件传一下吧
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文件见附件。
把本地调试的发邮件的代码也附件传一下吧
相关文章推荐
- eclipse 安装 TestNG插件的方法
- [Java] 读写字节数据,过滤流DataOutputStream和DataInputStream
- Ubuntu安装JAVA8
- [Java] 读写字符串数据
- Selenium入门------JAVA搭建、运行
- spring mvc返回String到页面乱码
- spring boot文件的上传下载
- JSON with Java
- Maven修改全局和局部JDK版本
- Java模板引擎
- eclipse代码注释的设置
- java-邮件发送接收和删改
- java中字符串的的替换replace和replaceAll的区别
- MyEclipse每次保存时提示MyEclipseErrors running builder 'DeploymentBuilder' on project..的解决方法
- Java一些常见的出错异常处理
- (java)求两个排序数组(升序)中第K小的数
- azkaban任务报错java.lang.RuntimeException: The root scratch dir: /tmp/hive
- java 读取,写入 txt 文件示例
- [编程题]滑雪 Java版 动态规划
- java.lang.OutOfMemoryError: Java heap space 的解决