2014-07-01 103 views
3

我在使用TidSMTP一個問題TIdSSLIOHandlerSocketOpenSSL得到「套接字錯誤」只需連接到服務器時。連接超時時idSMTP使用TIdSSLIOHandlerSocketOpenSSL

這裏的表格組件代碼

object IdSMTP: TIdSMTP 
    IOHandler = IdSSLIOHandlerSSL 
    Port = 465 
    SASLMechanisms = <> 
    UseTLS = utUseImplicitTLS 
    Left = 93 
    Top = 49 
    end 
    object IdSSLIOHandlerSSL: TIdSSLIOHandlerSocketOpenSSL 
    OnStatus = IdSSLIOHandlerSSLStatus 
    Destination = ':465' 
    MaxLineAction = maException 
    Port = 465 
    DefaultPort = 0 
    SSLOptions.Mode = sslmUnassigned 
    SSLOptions.VerifyMode = [] 
    SSLOptions.VerifyDepth = 0 
    OnStatusInfo = IdSSLIOHandlerSSLStatusInfo 
    Left = 88 
    Top = 112 
    end 

和Delphi代碼

IdSMTP.Username := 'username'; 
IdSMTP.Password := 'password'; 
IdSMTP.Host  := 'domain'; 
IdSMTP.Port  := 465; 
IdSMTP.UseTLS := utUseImplicitTLS; 
try 
    IdSMTP.Connect; 
except 
    on E:Exception do 
     // Socket Error, Connection Timeout is thrown. 
     Memo1.Lines.Add(E.Message); 
end; 

我登錄SSL IO狀態,並得到這個:

Resolving hostname {domain}. 
Connecting to {ip}. 
SSL status: "before/connect initialization" 
SSL status: "before/connect initialization" 
SSL status: "SSLv3 write client hello A" 
SSL status: "SSLv3 read server hello A" 
Socket Error # 10060 
Connection timed out. 

我們的郵件服務器使用自簽名順便提一下證書。

我在做什麼錯了?

TIA

更新:2014年7月2日

嘗試Sending mail to Gmail using Indy尖,但我得到連不上擺好發送後也SSLv3的讀取服務器招呼一個的電子郵件。

Resolving hostname smtp.gmail.com. 
Connecting to 74.125.25.108. 
Connected. 
Sending Email.. 
SSL status: "before/connect initialization" 
SSL status: "before/connect initialization" 
SSL status: "SSLv3 write client hello A" 
SSL status: "SSLv3 read server hello A" 
Disconnected. 
Connection Closed Gracefully. 

這裏的新代碼:

IdSMTP.Username := 'username'; 
IdSMTP.Password := 'password'; 
IdSMTP.Host  := 'smtp.gmail.com'; 
IdSMTP.UseTLS := utUseExplicitTLS; 
IdSMTP.Port  := 587; 
try 
    // Can connect successfully 
    IdSMTP.Connect; 

    // This part throws the exception 
    IdSMTP.Send(IdMessage); 
except 
    on E:Exception do 
     // Disconnected, connection closed gracefully 
     Memo1.Lines.Add(E.Message); 
end; 

UPDATE:

試圖使用Thunderbird發送電子郵件連接到同一個域。

雷鳥: Wireshark capture - Sending email using thunderbird

印: Wireshark capture - Using Indy

否 「客戶端密鑰交換,...​​」 發生在我的計劃。

解決

這isssue是通過手動設置connectiontimeout

回答

3

您正在使用SSL隱解決。這意味着,只要套接字連接到服務器,就會在交換任何應用程序數據(SMTP命令/響應)之前立即啓動SSL握手。客戶端hello被髮送到服務器,然後在等待服務器發回hello響應時發生超時。這意味着服務器未在要連接的端口上使用SSL。

東西要記住 - 設置UseTLS屬性可以改變Port屬性,所以一定要確保Port實際上當Connect()叫你期待什麼。爲了確保在設置UseTLS而不是之前設置Port

+0

超時/套接字錯誤發生在服務器hello之後,沒有額外的延遲。連接突然終止。 – jdc

+0

該端口正在使用SSL,因爲我們可以使用其他郵件客戶端(如Thunderbird)發送電子郵件。在設置UseTLS之後放置端口分配也具有相同的結果。 – jdc

+0

立即斷開連接可能意味着Gmail拒絕握手。您是否嘗試過使用數據包嗅探器來查看握手消息?另外,在連接到Gmail時,您是否將SSLVersion設置爲TLSv1?不要使用SSLv3。 –

0

請檢查您的防火牆是否被暫時禁用。 我到了這個頁面,因爲我遇到了同樣的問題 - 使用SSL進行SMTP時,立即斷開「正常關閉連接」。 然後我禁用了我的Avast!防火牆,它很好。