2013-02-07 25 views
3

代碼在Windows 8上停止工作。 它在Windows7, Windows XP(Service Pack 3) - 代碼工作。 如果Windows兼容模式爲Windows 7,則代碼無法工作。 我以管理員身份運行應用程序。已嘗試關閉防病毒和防火牆。我可以使用另一個smtp客戶端發送具有相同參數的電子郵件,例如.Net SmtpClient。該問題在不同的Windows 8計算機(家庭,辦公室)上重現。 我創建了簡單的測試應用程序。代碼是在Delphi XE,Indy 10.5.7上編寫的,OpenSSL 1.0.1.3 dll放在test.exe文件夾中。Indy10 + OpenSSL:發送電子郵件代碼在Windows 8上停止工作

任何想法?

代碼:

SSLHandler.MaxLineAction := maException; 
SSLHandler.SSLOptions.Method := sslvTLSv1; 
SSLHandler.SSLOptions.Mode := sslmUnassigned; 
SSLHandler.SSLOptions.VerifyMode := []; 
SSLHandler.SSLOptions.VerifyDepth := 0; 
SSLHandler.OnStatusInfo := IdSSLIOHandlerSocketOpenSSL1StatusInfo; 

SMTP.IOHandler := SSLHandler; 
SMTP.Host := 'smtp.gmail.com'; 
SMTP.Port := 587; 
SMTP.UseTLS := utUseExplicitTLS; 
SMTP.Username := FromAddress; 
SMTP.Password := AuthPassword; 

Email.From.Address := FromAddress; 
Email.Recipients.EmailAddresses := ToAddress; 
Email.Subject := Subject; 
Email.Body.Text := Body; 

SMTP.Connect; 
SMTP.Send(Email); 
SMTP.Disconnect; 

輸出:

SSL狀態: 「前/連接初始化」

SSL狀態: 「前/連接初始化」

SSL狀態: 「SSLv3寫客戶端你好A」

SSL狀態:「SSLv3讀服務器問候A」

EIdSocketError消息'套接字錯誤#10060連接超時。'

+0

這看起來與INDY無關,可能是防火牆或防病毒相關問題。你能建立一個連接到其他程序的同一個服務器/端口,例如,telnet嗎? – jachguate

+1

不要以爲它是防火牆或防病毒軟件。我已經嘗試關閉防病毒和防火牆。是的,我可以與其他程序建立到同一服務器/端口的連接,例如telnet。在Windows兼容模式下啓動應用程序時需要注意:Windows XP(Service Pack 3)在同一臺計算機上,代碼可以工作。 – user2051551

回答

0

因爲你可以使用.NET SmtpClient類成功發送電子郵件,我建議你使用數據包嗅探器,如Wireshark的,以查看SmtpClient的網絡流量,並把它比作印/ OpenSSL的網絡流量,看看到底有什麼區別。在OpenSSL的TLSv1握手過程中發生的事情不會發生在SmtpClient,所以請看看他們握手的實際外觀。

1

最後我發現它是Indy相關的問題。 升級到Indy 10.5.8或10.5.9可以解決問題。

感謝所有的建議。

7

這是IdHTTP的ReadTimeout。默認情況下,它是-1,不適用於Windows 8.將其設置爲15000ms或30000這樣的正值可以解決問題。

請注意,您需要在IdHTTP對象上以編程方式設置數值。不要嘗試通過對象檢查器設置綁定的IoHandler,因爲它不會以這種方式工作。

例子:

IdHTTP1.ReadTimeout := 30000; 

一個告訴印在其插座操作使用無限超時。然而,當連接將被丟棄解決OpenSSL中死鎖在Vista +,TIdSSLIOHandlerSocketOpenSSL迫使在較低插座層30秒超時如果ReadTimeout是< = 0}

溶液鮑勃Daneshfar張貼在this forum

0

你確定你已經發布OpenSSL庫與你的應用程序(如'libeay32.dll'和'ssleay32.dll')嗎?

當您忘記這些時,您也會因爲OpenSSL庫的錯誤未正確傳輸到外部IO對象(如TIdSMTP或TIdHTTP)而導致超時。

要檢查OpenSLL爲印是否可以載入我使用下面的代碼(當SSL不可用它提出了一個ERRE) - 使用單位「IdSSLOpenSSL」

TIdSSLContext.Create.Free; // Raises an error, when unable to load SSL lib and such 

您也可以插入OpenSSL的頭單元'IdSSLOpenSSLHeader'並嘗試手動加載庫並檢查它是否可以:

if not IdSSLOpenSSLHeaders.Load then ; // Raises no error, but return 'true' when it can load