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");
Ho provato questo e un paio di altre cose, ma ancora nessuna fortuna. – Geronimo
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
@ Geronimo Hai provato Javamail 1.4.5? – HulkingUnicorn