2012-05-17 91 views
3

我有一個Delphi 6應用程序發送附件的電子郵件。當我第一次測試它時,當我調用TIdSmtp.Connect()時,出現了11004錯誤(違反策略)。事實證明,我的電子郵件服務器的SMTP設置是錯誤的,現在它工作正常。但要知道我的用戶會遇到麻煩,我想知道是否有辦法通過Indy組件從SMTP服務器獲取更多廣泛的錯誤信息,以幫助我進行調試。我在Delphi 6中使用Indy 9。使用TIdSmtp.Connect()方法發生錯誤11004時獲取擴展錯誤信息?

有沒有辦法獲得更豐富的報告並找出可能的原因是什麼? (例如 - 需要SSL,未填寫字段,拒絕域名等)。此外,同樣的問題,但當TIdSmtp.Send()方法發生錯誤?

回答

6

EIdSMTPReplyError是爲了響應SMTP協議層的SMTP服務器的錯誤消息而引發的。 11004是套接字/ DNS錯誤,而不是SMTP錯誤。會有其他可用比基本操作系統錯誤消息(您可以從SysErrorMessage()獲得)無其他錯誤信息:

請求的名稱是有效的,並在數據庫中找到,但它並沒有相關的正確數據正在解決。

關於TIdSMTP.Send(),你可以看看EIdSMTPReplyError例外,如:

try 
    IdSMTP1.Connect; 
    try 
    IdSMTP1.Send(IdMessage1); 
    finally 
    IdSMTP1.Disconnect; 
    end; 
except 
    on E: EIdSMTPReplyError do 
    Application.MessageBox(
     PChar(
     'Error message: ' + E.Message + sLineBreak + 
     'Error code: ' + IntToStr(E.ErrorCode) + sLineBreak + 
     'Error reply: ' + E.EnhancedCode.ReplyAsStr 
    ), 
     'SMTP Error...', MB_OK + MB_ICONSTOP + MB_TOPMOST); 
end; 

這將幫助一些,如果服務器支持擴展的錯誤代碼,那麼你可能會得到一點點接近。但是,如果沒有查看SMTP上的實際SMTP命令/響應流量,您將不可能準確地區分出錯的地方。

關於SSL/TLS錯誤特別是幾個不同的事情之一可能發生,這取決於你TIdSMTP配置:

1),你可能會得到一個一般EIdSocketError異常升高,喜歡與你11004錯誤。

2)如果你連接到需要隱式SSL/TLS服務器端口可能會遭到EIdSMTPReplyError異常與畸形的錯誤代碼,但你不必TIdSMTP.UseTLS設置爲utUseImplicitTLS

2)如果已指定UseTLS=utUseImplicitTLS但服務器不期望隱式SSL/TLS,則可能會收到EIdOSSLConnectError或其他與OpenSSL相關的異常。

3)您有UseTLS設置爲utUseExplicitTLSutRequiresTLS和服務器支持TLS明確,但SSL/TLS握手因任何原因而失敗,你會得到一個TIdSMTP.OnTLSHandShakeFailed事件觸發僅供utUseExplicitTLS。如果事件處理程序未設置VContinue=True,或者您使用了utRequiresTLS,則會出現EIdTLSClientTLSHandShakeFailed異常。

4)您有UseTLS設置爲utUseExplicitTLSutRequiresTLS和服務器不支持TLS明確,你會得到一個TIdSMTP.OnTLSNotAvailable事件觸發僅utUseExplicitTLS。如果事件處理程序未設置VContinue=True,或者您使用utRequiresTLS,則會收到EIdTLSClientTLSNotAvailable異常。

+0

@tlama顯示了什麼?我在這個線程中看不到它。 – nurettin

+0

@nurettin:我更新了答案以顯示它。 –