2011-01-06 44 views
2

我正在使用JavaMail連接到POP3服務器。如何正確設置JavaMail超時設置

而且,我設置以下屬性,這樣的JavaMail不會等待很長時間,如果郵件服務器不響應:

props.setProperty("mail.pop3.connectionpooltimeout", "3000"); 
props.setProperty("mail.pop3.connectiontimeout", "3000"); 
props.setProperty("mail.pop3.timeout", "3000"); 

然而,在某些情況下超時工作正常,但有時凍結的JavaMail (!)與以下調試消息:

DEBUG POP3: connecting to host "pop3.yahoo.com", port 110, isSSL false 

更改端口或協議(SSL,TLS ..)不起作用。我假設主機根本不存在。

例如,如果我查詢pop3.yahoo.com代替pop.mail.yahoo.com(這將是正確的主機名),我不得不等待很長時間直到發生超時異常。 幾分鐘後,我得到以下異常,應用程序繼續運行:

java.net.ConnectException: Operation timed out 

pop3.yahoo.com似乎存在,但不會迴應:

localhost:~ me$ ping pop3.yahoo.com 
PING pop3.yahoo.com (206.190.46.10): 56 data bytes 
Request timeout for icmp_seq 0 
Request timeout for icmp_seq 1 
Request timeout for icmp_seq 2 
Request timeout for icmp_seq 3 
^C 

你可能會問爲什麼我使用pop3.yahoo.com而不是pop.mail.yahoo.com。 那麼,我只是想測試如果我的應用程序的用戶插入了錯誤的主機名會發生什麼。

我認爲這個問題與此報告http://www.opensubscriber.com/message/[email protected]/180946.html有關,其中發佈者聲稱如果電子郵件服務器關閉連接就會出現問題。 JavaMail似乎等待很長時間(不知道爲什麼)。

由於問題未在我發佈的鏈接中解決:有人知道如何修復或至少調試嗎?

任何幫助將真的很感激

回答

2

我找到了問題的原因。這是我的代碼中的一個錯誤。 Javamail尊重超時設置。

0

最有可能的是,雅虎悄悄地丟棄了針對該主機的所有數據包。這有點煩人,否則你會立即回到主機無法訪問或拒絕連接,這將更容易處理。一切看起來不錯,假設你使用POP3而不是POP3S。

我從API中看到,您可以提供自己的SocketFactory。這樣做可以更好地控制套接字參數,並且可以測試套接字是否真的被JavaMail正確創建(如果設置SocketFactory屬性不起作用,那麼您知道這是查看的地方)。如果一切都失敗了,您可以設置一個額外的線程來設置超時並在JavaMail線程到期時中斷該線程。這當然是所有解決方法。

檢查netstat連接的狀態也是有幫助的。如果超時它應該在SYN_SENT中。

+0

如果雅虎真的無聲無息地丟棄所有數據包,爲什麼Javamail不遵守我在Property對象中提供的超時設置?這真的很奇怪。 – Timo 2011-01-08 10:29:48