2013-03-15 50 views
1

如何將我的Java應用程序配置爲使用帶有TLS的端口993從IMAP郵箱讀取郵件。如何配置「imaps」接收郵件? JavaMail

我將我的郵件服務器的證書存儲在默認的javakeystore cacerts中。 嘗試連接到郵箱後。我得到這個堆棧跟蹤(這是一個完整跟蹤):

javax.mail.MessagingException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty; 
nested exception is: 
    javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:670) 
    at javax.mail.Service.connect(Service.java:317) 
    at javax.mail.Service.connect(Service.java:176) 
    at javax.mail.Service.connect(Service.java:125) 
    at imap.IMAP.receive(IMAP.java:77) 
    at imap.IMAP.main(IMAP.java:46) 
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1764) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1725) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1708) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1237) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:548) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:352) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:207) 
    at com.sun.mail.iap.Protocol.<init>(Protocol.java:113) 
    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:111) 
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:637) 
    ... 5 more 
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:57) 
    at sun.security.validator.Validator.getInstance(Validator.java:161) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:108) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:204) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230) 
    ... 12 more 
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183) 
    at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103) 
    at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87) 
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:55) 
    ... 23 more 
15.03.2013 13:54:50 imap.IMAP main 
SCHWERWIEGEND: null 
java.lang.NullPointerException 
    at imap.IMAP.receive(IMAP.java:123) 
    at imap.IMAP.main(IMAP.java:46) 

這是我的proporties:

System.setProperty("javax.net.ssl.trustStore", "/usr/java/jdk_1.6.0_35/jre/lib/security/cacerts"); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

Properties props = System.getProperties(); 

props.setProperty("mail.imaps.host", server); 
props.setProperty("mail.imaps.user", user); 
props.setProperty("mail.imaps.password", password); 
props.setProperty("mail.imaps.auth", "true"); 
props.setProperty("mail.imaps.starttls.enable", "true"); 
props.setProperty("mail.imaps.socketFactory.port", "993"); 
props.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.imaps.socketFactory.fallback", "false"); 

MailAuthenticator auth = new MailAuthenticator(user, password); 

Session session = Session.getDefaultInstance(props, auth); 

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

是缺少點什麼?在互聯網上有很多關於這個問題的文章。但最重要的是SMTP。我還沒有找到真正解釋的東西,你真的需要哪些屬性來獲得這個案例的工作。

我希望有人能幫我找到我的錯誤。

非常感謝。

回答

1

首先提出一些看法,是不是你的問題的原因,但將簡化程序......

擺脫的SocketFactory性質的,你不需要他們。

使用Session.getInstance而不是Session.getDefaultInstance。

擺脫MailAuthenticator並調用store.connect(用戶,密碼)。

有關詳細信息,請參閱JavaMail FAQ

至於你得到的例外,它似乎是與你的證書或你的信任存儲相關的一些問題。 This JavaMail FAQ entry有指向調試這些問題的提示。您可能需要Java SSL /網絡/安全專家來解釋發生了什麼問題。

你說你已經將你的證書添加到你的信任存儲,但以防萬一你可能想檢查this JavaMail FAQ entry

相關問題