我有以下代码,应该通过 IMAP 打开与 Microsoft Exchange 服务器的连接:
Folder inputFolder = null;
Folder doneFolder = null;
Store store = null;
Properties properties = new Properties();
Session emailSession = null;
properties.put("mail.imaps.host", imapHost);
properties.put("mail.imaps.user", mailUsername);
properties.put("mail.imaps.port", Integer.toString(imapPort));
properties.put("mail.imaps.starttls.enable", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustedHosts(new String[]{"XXXXXXXXX"});
properties.put("mail.imaps.socketFactory", sf);
properties.put("mail.debug", "true");
logger.info(String.format("Using user name '%s'", mailUsername));
try {
emailSession = createEmailSession(properties);
store = getStore(emailSession);
store.connect(mailUsername, mailPassword);
XXXXXXXXX
是主机名。
createEmailSession
和 getStore
方法如下所示:
Store getStore(final Session emailSession) throws NoSuchProviderException {
return emailSession.getStore("imaps");
}
Session createEmailSession(final Properties properties) {
return Session.getInstance(properties);
}
store.connect(mailUsername, mailPassword)
导致以下错误消息:
Caused by: javax.mail.AuthenticationFailedException: AUTHENTICATE failed.
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:732)
at javax.mail.Service.connect(Service.java:366)
at javax.mail.Service.connect(Service.java:246)
at javax.mail.Service.connect(Service.java:267)
调试输出如下所示:
DEBUG: JavaMail version 1.6.2
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: enable STARTTLS
DEBUG IMAPS: closeFoldersOnStoreFailure
DEBUG IMAPS: trying to connect to host "XXXXXXXXX", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN SASL-IR UIDPLUS MOVE ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAPS: AUTH: PLAIN
DEBUG IMAPS: protocolConnect login, host=XXXXXXXXX, user=YYYYYYYYY, password=<non-null>
DEBUG IMAPS: AUTHENTICATE PLAIN command trace suppressed
DEBUG IMAPS: AUTHENTICATE PLAIN command result: A1 NO AUTHENTICATE failed.
DEBUG IMAPS: IMAPStore cleanup, not connected
凭证(
YYYYYYYYY
和相应的密码)曾经有效。然后我开始收到这样的消息。我与管理员交谈,他们告诉我,由于多次尝试使用错误密码登录,用户被锁定。他们还说他们解锁了用户,现在应该可以使用了。
但事实并非如此。
根据上面的调试输出,如何缩小问题范围?
更新1:根据this页面,Exchange服务器仅支持Kerberos和NTLM身份验证,而我正在使用
PLAIN
。也许这就是失败的原因。
更新 2: 这个答案建议使用 ews-java-api 来访问 Exchange Server。会尝试一下。
更新 3: 使用
抑制纯文本身份验证properties.put("mail.imap.auth.plain.disable", "true");
没有帮助。
我也遇到了和你一样的问题,请问你解决了吗?请您与我分享我被困了3天的解决方案:(