Aci*_*ier 24 java imap exchange-server jakarta-mail
我正在尝试实现Java Mail servlet,第一步是连接到IMAP服务器.
我能够通过端口143(默认IMAP端口)telnet到服务器,telnet说: OK The Microsoft Exchange IMAP4 service is ready.
现在我尝试使用Java Mail API连接到服务器,如下所示:
Properties props = new Properties();
session = Session.getDefaultInstance(props, null);
store = session.getStore("imap");
store.connect("host","user","password");
Run Code Online (Sandbox Code Playgroud)
我能够使用现有的Outlook Webapp连接到同一台服务器,并使用与我在java中传递给它的相同凭据.
但运行此命令session.setDebug(true)会产生以下输出:
DEBUG: setDebug: JavaMail version 1.4.5
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: trying to connect to host "myHost", port 143, isSSL false
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null>
javax.mail.MessagingException: No login methods supported!;
Run Code Online (Sandbox Code Playgroud)
编辑:
我prop.setProperty("mail.imap.starttls.enable", "true")按照建议添加了.
但是,我开始得到这个调试输出:
DEBUG: setDebug: JavaMail version 1.4.5
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: enable STARTTLS
DEBUG: trying to connect to host "myHost", port 143, isSSL false
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG: protocolConnect login, host=myHost, user=myUser, password=<non-null>
A1 STARTTLS
A1 OK Begin TLS negotiation now.
DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)
假设这是证书问题,我按照这些说明将邮件服务器添加到我的cacerts文件中.包含在那里的测试程序运行完全正常,我可以使用SSL URL进行连接,但是在运行java邮件类时我仍然遇到了相同的异常.
我还尝试使用:( session.getStore("imaps")而不是"imap")更改为"imaps",甚至无法获得"Microsoft Exchange Server现已就绪"消息.我认为因为只要指定了"imaps",它就会尝试连接端口993.但是使用telnet到端口993并不显示与电子邮件服务器的任何连接.
接下来我尝试强制程序在端口143上使用SSL,如下所示:
// Use SSL
prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
prop.setProperty("mail.imap.socketFactory.fallback", "false");
// Use port 143
prop.setProperty("mail.imap.port", "143");
prop.setProperty("mail.imap.socketFactory.port", "143");
Run Code Online (Sandbox Code Playgroud)
只是为了接收这个例外,所以我认为它不需要与SSL有任何关系:
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: trying to connect to host "myHost", port 143, isSSL false
Not able to process the mail reading.
javax.mail.MessagingException: Unrecognized SSL message, plaintext connection?;
Run Code Online (Sandbox Code Playgroud)
上面的(DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:)TLS异常是否来自Exchange Server上未启用的TLS?
我没有准备好访问电子邮件服务器,但我可能会让某人让我进去.
解:
HulkingUnicorn在他的回答下面的评论指出了这个答案,这是所需的确切处理.显然MS Exchange Server有这个问题.除了将该答案中列出的类添加到我的包中之外,我只是实现了这样的邮件连接,一切都很顺利:
Properties prop = new Properties();
prop.setProperty("mail.imap.starttls.enable", "true");
prop.setProperty("ssl.SocketFactory.provider", "my.package.name.ExchangeSSLSocketFactory");
prop.setProperty("mail.imap.socketFactory.class", "my.package.name.ExchangeSSLSocketFactory");
session = Session.getDefaultInstance(prop, null);
session.setDebug(true);
store = session.getStore("imap");
store.connect("myHost","myUser","myPassword");
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用com.sun.mail.util.MailSSLSocketFactoryjavamail 1.4.5 API中的一部分.
例:
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.imap.starttls.enable", "true");
props.put("mail.imap.ssl.socketFactory", sf);
Run Code Online (Sandbox Code Playgroud)
无需使用自定义SSLSocketFactory.
| 归档时间: |
|
| 查看次数: |
33687 次 |
| 最近记录: |