Use Javamail for accessing Microsoft Exchange mailboxes (IMAP, MS Exchange)
Asked Answered
S

3

6

I need to connect to a Microsoft Exchange Server through IMAPS JavaMail. First, I got the:

A1 NO AUTHENTICATE failed.
javax.mail.AuthenticationFailedException: AUTHENTICATE failed.

exception in my debugger.

Then, I disabled some authentication protocols:

imapProps.setProperty("mail.imaps.auth.plain.disable", "true");
imapProps.setProperty("mail.imaps.auth.ntlm.disable", "true");
imapProps.setProperty("mail.imaps.auth.gssapi.disable", "true");

This is the new exception I'm getting (I've attached the whole log):

DEBUG: setDebug: JavaMail version 1.4.4
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: disable AUTH=PLAIN
DEBUG: disable AUTH=NTLM
DEBUG: enable STARTTLS
DEBUG: trying to connect to host "host.domain.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN UIDPLUS CHILDREN IDLE  NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAP: AUTH: NTLM
DEBUG IMAP: AUTH: GSSAPI
DEBUG IMAP: AUTH: PLAIN
DEBUG: protocolConnect login, host=host.domain.com, [email protected],  password=<non-null>
A1 LOGIN [email protected] password
A1 NO LOGIN failed.
DEBUG: trying to connect to host "host.domain.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready.
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAP: AUTH: NTLM
DEBUG IMAP: AUTH: GSSAPI
DEBUG IMAP: AUTH: PLAIN
DEBUG: protocolConnect login, host=host.domain.com, [email protected], password=<non-null>
A1 LOGIN [email protected] password
A1 NO LOGIN failed.
javax.mail.AuthenticationFailedException: LOGIN failed.
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:660)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at ConnectMail.connectMail(ConnectMail.java:63)
at Main.main(Main.java:9)

Now I'm getting the "NO LOGIN failed" Exception.

This is my full code:

Properties imapProps = new Properties();
imapProps.setProperty("mail.imaps.socketFactory.port", "993");
imapProps.setProperty("mail.imaps.starttls.enable", "true");
imapProps.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
imapProps.setProperty("mail.imaps.socketFactory.fallback", "false");
imapProps.setProperty("mail.imaps.auth.plain.disable", "true");
imapProps.setProperty("mail.imaps.auth.ntlm.disable", "true");
imapProps.setProperty("mail.imaps.auth.gssapi.disable", "true");
imapProps.setProperty("username", "[email protected]");   
imapProps.setProperty("password", "password");

String host = "host.domain.com";
int port = Integer.parseInt("993");

Authenticator authenticator = new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("[email protected]", "password");
    }
};

session = Session.getInstance(imapProps, authenticator);

session.setDebug(true);

Store store = session.getStore("imaps");

store.connect(host, "[email protected]", "password");
Sophistic answered 19/11, 2013 at 8:41 Comment(4)
Your code is absolutely correct (perhaps some lines not needed at all - authenticator example because you are using username and password in your connect - but do not worry) it works within our exchange environment. Yo need to talk to your Exchange SysAdmin because the problem should come from that side.Seducer
Sorry for the late update. Yes, this code was correct. The issue was with the Exchange Server. This code is correct if anyone is planning to use it..Sophistic
Can you please describe the issue that your Exchange Server was having when you received this error. Thanks!Corinacorine
It was simple, I was provided with the wrong credentials. @CorinacorineSophistic
C
2

You need to use a newer version of JavaMail that supports NTLM authentication. The latest version is 1.5.1.

Also, see this list of common mistakes.

Cree answered 20/11, 2013 at 5:32 Comment(0)
D
1

It will workout if the username and the mail id both are same.

For example: system username is john and mail id [email protected]

IMAP is try to login the mail id using the username "john" from [email protected], if the user id is differ it will not login.

Dorcia answered 16/10, 2018 at 10:24 Comment(0)
M
0

Try using your own Authenticator

public class ExchangeAuthenticator extends Authenticator {

    String username;
    String password;

    public ExchangeAuthenticator(String username, String password) {
        super();
        this.username= username;
        this.password= password;
    }

    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
}

and in your code add

session = Session.getInstance(props,new ExchangeAuthenticator(username, password));
Monamonachal answered 19/11, 2013 at 8:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.