2011-09-26 152 views
0

我正在使用JavaMail,我希望它通過代理爲每個線程(我有多線程應用程序)工作。我爲此使用SMTPTransport.connect(套接字套接字)。JavaMail:套接字讀取超時

這裏是套接字初始化:

socket = new Socket(); 
socket.setSoTimeout(10000); 
socket.connect(new InetSocketAddress(smtpHost, smtpPort)); 

這裏是SMTPTransport電話:

SMTPTransport transport = null; 
try 
    { 
    transport = (SMTPTransport) mail.getTransport("smtp"); 
    transport.connect(socket); 
    System.out.println("ok"); 

等。但我這個錯誤發生:

DEBUG:JavaMail的版本1.4.4 DEBUG:成功加載資源: /META-INF/javamail.default.providers DEBUG:加載提供商的表 DEBUG:供應商上市類名稱: {com.sun.mail.smtp.SMTPSSLTransport = javax.mail.Provider [TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems,Inc], com.sun.mail.smtp.SMTPTransport = javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems,Inc], com.sun.mail.imap.IMAPSSLStore = javax.mail.Provider [STORE,imaps,com .sun.mail.imap.IMAPSSLStore,Sun Microsyste ms,Inc], com.sun.mail.pop3.POP3SSLStore = javax.mail.Provider [STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems,Inc], com.sun.mail。 imap.IMAPStore = javax.mail.Provider [STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems,Inc], com.sun.mail.pop3.POP3Store = javax.mail.Provider [STORE, POP3,com.sun.mail.pop3.POP3Store,Sun Microsystems,Inc]} DEBUG:Providers Listed By Protocol: {imaps = javax.mail.Provider [STORE,imaps,com.sun.mail.imap.IMAPSSLStore, Sun Microsystems,Inc], imap = javax.mail.Provider [STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems,Inc], smtps = javax.mail.Provider [TRANSPORT,smtps, com.sun.mail.smtp.SMTPSSLTransport,蘇pop3 = javax.mail.Provider [STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems,Inc], pop3s = javax.mail.Provider [STORE,pop3s, com.sun.mail.pop3.POP3SSLStore,Sun Microsystems,Inc], smtp = javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems,Inc]} DEBUG:成功加載的資源: /META-INF/javamail.default.address.map DEBUG:getProvider()返回 javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems,Inc] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP: useEhlo true,useAuth true DEBUG SMTP:啓動協議到主機 「smt p.googlemail.com「,端口465 DEBUG SMTP:異常讀取 響應:java.net.SocketTimeoutException:讀取超時異常 讀取響應javax.mail.MessagingException:異常讀取 響應;嵌套異常爲:java.net.SocketTimeoutException: 讀取超時時間爲 com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2153) at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport .java:1956) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:636) at javax.mail.Service.connect(Service.java:317)at javax.mail.Service。連接(Service.java:176) javax.mail.Service.connect(Service.java:125) com.sun.mail.smtp.SMTPTransport。連接(SMTPTransport.java:274) lsmtpc.CheckAccount.run(CheckAccount.java:203)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471) at java.util.concurrent。 FutureTask $ Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)導致: java.net.SocketTimeoutException:讀取超時時間爲 java.net.SocketInputStream.socketRead0(Native Method) java.net.SocketInputStream.re (SocketInputStream.java:150)at java.net.SocketInputStream.read(SocketInputStream.java:121)at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:110)at java.io. BufferedInputStream.fill(BufferedInputStream.java:235)在 java.io.BufferedInputStream.read(BufferedInputStream.java:254)在 com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:89) 在 COM .sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:2131) ...... 13多個

所以我看到的JavaMail無法從套接字讀取。那麼我做錯了什麼?如果我嘗試在構造函數中使用transport.connect()方法而不使用Socket,所有工作都很完美,並且可以從telnet訪問smtpHost/smtpPort,並且我沒有任何防火牆/防病毒軟件。

回答

1

從com.sun.mail.smtp.SMTPTransport的文檔:

在一般情況下,應用程序不應該需要這個 包直接使用的類。相反,他們應該使用由 javax.mail包(和子包)定義的API。應用程序絕不應該使用 直接構造SMTPTransport的實例。相反,他們應該使用Session方法getTransport來獲取適當的 傳輸對象。

警告:此包的唯一API應視爲 實驗。它們可能會在未來發生變化,其方式是 與使用當前API的應用程序不兼容。

JavaMail的教程:http://java.sun.com/developer/onlineTraining/JavaMail/contents.html

可能是你沒有通過認證的信息。可能是您正在使用普通插座連接到安全主機。您可能想要閱讀鏈接的教程,以獲取使用JavaMail的最佳方式。

+0

是的,但如何以另一種方式使用代理的javamail? JM沒有任何代理設置。 – purple

+0

也在這裏是沒有任何有關不使用的信息:http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/SMTPTransport.html所以我不明白爲什麼它不能從套接字讀取。 – purple

+0

假設設置正確,您不必通過郵件代理進行任何特殊的連接。也就是說,這是一個網絡配置問題,而不是軟件編碼 - http://www.oracle.com/technetwork/java/faq-135477.html#proxy。 – Perception