2012-05-04 12 views
22

Sto tentando di implementare un servlet Java Mail, il primo passo è la connessione al server IMAP.Java Mail to Exchange Server "nessun metodo di accesso supportato"

sono in grado di telnet al server sulla porta 143 (porta IMAP di default), telnet dice: OK The Microsoft Exchange IMAP4 service is ready.

Ora sto provando a connettersi al server utilizzando l'API Java mail come questa:

Properties props = new Properties(); 
session = Session.getDefaultInstance(props, null); 
store = session.getStore("imap"); 
store.connect("host","user","password"); 

E sono in grado di connettersi a questo stesso server utilizzando un'applicazione Web Outlook esistente con le stesse credenziali che sto cercando di trasmettere ad esso in java.

Ma l'esecuzione di questo con session.setDebug(true) produce il seguente output:

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!; 

EDIT:

ho aggiunto prop.setProperty("mail.imap.starttls.enable", "true") come suggerito.

Tuttavia, ho cominciato a ricevere questo output di debug:

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 

Supponendo che questo era un problema di certificato ho seguito these instructions e ha aggiunto server di posta per il mio file cacerts. Il programma di test incluso lì funzionava perfettamente e potevo connettermi usando un url SSL ma ho comunque ottenuto la stessa eccezione durante l'esecuzione della classe java mail.

Ho anche provato a passare a "imaps" con: session.getStore("imaps") (anziché "imap") e non ero nemmeno in grado di ottenere il messaggio "Microsoft Exchange Server è pronto". Penso che stia cercando di connettersi sulla porta 993 ogni volta che è stato specificato "imaps". Ma l'utilizzo di telnet sulla porta 993 non mostra alcuna connessione al server di posta elettronica.

Così la prossima ho provato a forzare il programma per utilizzare SSL sulla porta 143 in questo modo:

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

solo per ricevere questa eccezione, quindi non credo che vuole niente a che fare con 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?; 

È possibile che l'eccezione TLS sopra (DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException:) provenga da TLS non abilitato sul server di Exchange?

Non ho pronto accesso al server di posta elettronica, ma probabilmente ho potuto ottenere a qualcuno di farmi entrare

SOLUZIONE:.

commento di HulkingUnicorn sotto la sua risposta rilevare this answer che era il trattamento esatto necessario. Apparentemente MS Exchange Server ha questo problema. Insieme con l'aggiunta della classe elencati in quella risposta al mio pacchetto, ho semplicemente implementato le mie connessioni di posta elettronica come questo e tutto andava bene:

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

risposta

17

Questa parte, * CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED suggeriscono non è possibile accedere, in this thread il PO risolto aggiornando il suo Javamail alla versione 1.4.4 (anche se il tuo output di debug suggerisce che l'hai già ottenuto).Prova a utilizzare 1.4.5.

In realtà, prova ad aggiungere questa riga prima di creare la sessione; il tuo server di posta elettronica lo supporta ed è disabilitato per impostazione predefinita: props.put("mail.imap.starttls.enable", "true");

This answer risolto il problema.

+0

Ho provato questo e un paio di altre cose, ma ancora nessuna fortuna. – Geronimo

+1

Se si utilizzano "imaps", è necessario aggiungere anche le "s" a tutte le proprietà, come "prop.setProperty (" mail.imaps.port "," 143 ");" Non sembra probabile che il server usa però imaps con quel numero di porta. – HulkingUnicorn

+0

@ Geronimo Hai provato Javamail 1.4.5? – HulkingUnicorn

5

È possibile utilizzare lo com.sun.mail.util.MailSSLSocketFactory che fa parte dell'API di javamail 1.4.5.

Esempio:

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

Non v'è alcuna necessità di utilizzare lo SSLSocketFactory personalizzato.

+0

Uomo fantastico! hai salvato la mia giornata –

Problemi correlati