使用JavaMail连接到具有IMAP活动的Exchange服务器

时间:2014-04-12 00:58:12

标签: java javamail

我使用JavaMail 1.5.1连接到多个电子邮件帐户(不同的提供商等)。它看起来非常适合许多服务,但我在尝试连接其中几个时遇到了问题。两者似乎都有相同的反应。

apptix.com提供了一项给我带来麻烦的服务。正如我从online docs(第21页)中读取的那样,smtp / imap设置如下:

  • smtp主持人:smtp.apptixemail.net
  • smtp port:587
  • TLS

  • imap host:imap.apptixemail.net

  • imap port:993
  • SSL

我已经获得了测试用户的用户名和密码。我能够连接到SMTP但不能连接到IMAP。这是我连接到IMAP的代码

public static IMAPStore connectToImap(String host, int port, String username, String password) throws MessagingException {
    Properties props = System.getProperties();
    props.setProperty("mail.imap.sasl.enable", "true");
    props.setProperty("mail.imap.starttls.enable", "true");

    props.setProperty("mail.imap.auth.ntlm.disable", "true");
    props.setProperty("mail.imap.auth.plain.disable", "true");
    props.setProperty("mail.imap.auth.gssapi.disable", "true");
    props.setProperty("mail.imap.ssl.enable", "true");

    Session imapSession = Session.getInstance(props);
    IMAPStore store = new IMAPStore(imapSession, null);
    store.connect(host, port, username, password);

    return store;
}

这是执行连接到SMTP和IMAP的方法后我得到的跟踪

DEBUG: setDebug: JavaMail version 1.5.1
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.apptixemail.net", port 587, isSSL false
220 smtp.apptixemail.net Microsoft ESMTP MAIL Service ready at Fri, 11 Apr 2014 19:50:15 -0500
DEBUG SMTP: connected to host "smtp.apptixemail.net", port: 587

EHLO 10.58.0.246
250-smtp.apptixemail.net Hello [10.2.64.1]
250-SIZE 57671680
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
DEBUG SMTP: Found extension "SIZE", arg "57671680"
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
STARTTLS
220 2.0.0 SMTP server ready
EHLO 10.58.0.246
250-smtp.apptixemail.net Hello [10.2.64.1]
250-SIZE 57671680
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
DEBUG SMTP: Found extension "SIZE", arg "57671680"
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG: setDebug: JavaMail version 1.5.1
DEBUG IMAP: mail.imap.fetchsize: 16384
DEBUG IMAP: mail.imap.ignorebodystructuresize: false
DEBUG IMAP: mail.imap.statuscachetimeout: 1000
DEBUG IMAP: mail.imap.appendbuffersize: -1
DEBUG IMAP: mail.imap.minidletime: 10
DEBUG IMAP: disable AUTH=PLAIN
DEBUG IMAP: disable AUTH=NTLM
DEBUG IMAP: enable STARTTLS
DEBUG IMAP: enable SASL
DEBUG IMAP: trying to connect to host "imap.apptixemail.net", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAP: AUTH: NTLM
DEBUG IMAP: AUTH: GSSAPI
DEBUG IMAP: AUTH: PLAIN
DEBUG IMAP: protocolConnect login, host=imap.apptixemail.net, user=XXX@YYY.com, password=<non-null>
DEBUG IMAP: SASL authentication command trace suppressed
DEBUG IMAP: SASL Mechanisms:
DEBUG IMAP:  NTLM
DEBUG IMAP:  GSSAPI
DEBUG IMAP:  PLAIN
DEBUG IMAP: 
2014-04-11 17:50:26.614 java[32026:1003] Unable to load realm info from SCDynamicStore
DEBUG IMAP: Failed to create SASL client, THROW: 
javax.security.sasl.SaslException: Failure to initialize security context [Caused by GSSException: Invalid name provided (Mechanism level: Could not load configuration from SCDynamicStore)]
    at com.sun.security.sasl.gsskerb.GssKrb5Client.<init>(GssKrb5Client.java:132)
    at com.sun.security.sasl.gsskerb.FactoryImpl.createSaslClient(FactoryImpl.java:45)
    at javax.security.sasl.Sasl.createSaslClient(Sasl.java:354)
    at com.sun.mail.imap.protocol.IMAPSaslAuthenticator.authenticate(IMAPSaslAuthenticator.java:131)
    at com.sun.mail.imap.protocol.IMAPProtocol.sasllogin(IMAPProtocol.java:765)
    at com.sun.mail.imap.IMAPStore.login(IMAPStore.java:761)
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:665)
    at javax.mail.Service.connect(Service.java:345)
    at test.Mailbox.connectToImap(MailboxUtils.java:561)
    at test.TestUserPass.main(TestUserPass.java:470)
Caused by: GSSException: Invalid name provided (Mechanism level: Could not load configuration from SCDynamicStore)
    at sun.security.jgss.krb5.Krb5NameElement.getInstance(Krb5NameElement.java:110)
    at sun.security.jgss.krb5.Krb5MechFactory.getNameElement(Krb5MechFactory.java:80)
    at sun.security.jgss.GSSManagerImpl.getNameElement(GSSManagerImpl.java:188)
    at sun.security.jgss.GSSNameImpl.getElement(GSSNameImpl.java:428)
    at sun.security.jgss.GSSNameImpl.init(GSSNameImpl.java:157)
    at sun.security.jgss.GSSNameImpl.<init>(GSSNameImpl.java:127)
    at sun.security.jgss.GSSManagerImpl.createName(GSSManagerImpl.java:123)
    at com.sun.security.sasl.gsskerb.GssKrb5Client.<init>(GssKrb5Client.java:90)
    ... 9 more
DEBUG IMAP: SASL authentication failed
DEBUG IMAP: LOGIN command trace suppressed
DEBUG IMAP: LOGIN command result: A1 NO LOGIN failed.
Exception in thread "main" javax.mail.AuthenticationFailedException: LOGIN failed.
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:684)
    at javax.mail.Service.connect(Service.java:345)
    at test.Mailbox.connectToImap(MailboxUtils.java:561)
    at test.TestUserPass.main(TestUserPass.java:470)

我想知道为什么会这样。我不知道为什么这不起作用。我不知道它是否与GSSAPI例外有关或者它有什么不同......正如你可以在代码中看到的那样我已经禁用了ntlm和plain(如JavaMail docs)但没有。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,即使它没有涉及代码中的问题我想在此记录它为什么失败。

似乎我正在使用的IMAP主机(imap.apptix.com)仅适用于Outlook,但它不适用于JavaMail。我有关于该服务的更多信息,他们将imap.collaborationhost.net指向Thunderbird的IMAP主机。我已经在我的代码中尝试了它,并且它很有效。

另外,我想指出GSSException只是一个警告而不影响最终结果。我也通过成功的身份验证获得了它。