Java 邮件到 Exchange Server “不支持登录方法”

2022-09-01 17:38:54

我正在尝试实现Java Mail servlet,第一步是连接到IMAP服务器。

我能够在端口143(默认IMAP端口)上远程登录到服务器,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");

而且我能够使用现有的Outlook Webapp连接到同一台服务器,该Webapp具有我尝试在java中传递给它的相同凭据。

但是运行 this 会生成以下输出: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!;

编辑:

我按照建议添加。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

假设这是一个证书问题,我按照这些说明将邮件服务器添加到我的cacerts文件中。其中包含的测试程序运行完全正常,我可以使用SSL url进行连接,但是在运行java邮件类时,我仍然遇到相同的异常。

我还尝试使用以下命令更改为“imaps”(而不是“imap”),甚至无法获得“Microsoft Exchange Server现在已准备就绪”消息。我想是因为每当指定“imaps”时,它都在尝试在端口993上进行连接。但是,使用远程登录到端口 993 不会显示与电子邮件服务器的任何连接。session.getStore("imaps")

所以接下来我试图强制程序在端口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");

只是为了接收这个异常,所以我认为它不希望与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?;

上述 TLS 例外 () 是否来自未在 Exchange Server 上启用 TLS?DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:

我没有现成的电子邮件服务器访问权限,但我可能会有人让我进入。

溶液:

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");

答案 1

这部分,表明你不能登录,在这个线程中,OP通过将他的Javamail更新到1.4.4来解决它(尽管你的调试输出表明你已经得到了它)。请尝试使用 1.4.5。* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED

实际上,在创建会话之前尝试添加此行;您的电子邮件服务器支持它,默认情况下处于禁用状态:props.put("mail.imap.starttls.enable", "true");

这个答案解决了问题。


答案 2

您可以使用 javamail 1.4.5 API 的一部分。com.sun.mail.util.MailSSLSocketFactory

例:

MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.imap.starttls.enable", "true");
props.put("mail.imap.ssl.socketFactory", sf);

没有必要使用自定义的SSSocketFactory。


推荐