2014-10-18 50 views
2

我有一個TIdSMTPServer是在端口25和465上運行,它是OnConnect事件是這樣的:是否有可能實現SSL連接當端口收到的郵件25

procedure TMainForm.SMTPServerConnect(AContext: TIdContext); 
begin 
    if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then begin 
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False; 
end; 

激活SMTPServer這片之前代碼被執行:

with IdServerIOHandlerSSLOpenSSL1 do begin 
    SSLOptions.CertFile := myCertFile; 
    SSLOptions.RootCertFile := myRootCertFile; 
    SSLOptions.KeyFile := myKeyFile; 
end; 
SMTPServer.IOHandler := IdServerIOHandlerSSLOpenSSL1; 

一切都很好,當一個客戶端試圖連接到端口465(使用implicit SSL)。但是當另一個smtp服務器(例如yahoogmail)發送郵件時,它會發送到端口25,並在我的OnConnect事件中被設備阻止。所以我問是否有可能發出類似STARTTLS的信息,並以某種方式使用SSL對端口25上的連接進行加密,或者有辦法告訴另一方我希望使用SSL在端口465上進行通信(在兩種情況下均使用我的證書,連接總是直接的 - 沒有用戶名/密碼認證)?

回答

1

在Indy 10中,PassThrough默認爲true。你需要看看它的端口號設置PassThrough爲False,如前實際連接到客戶端:

procedure TMainForm.SMTPServerConnect(AContext: TIdContext); 
begin 
    if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then 
    begin 
    if AContext.Binding.Port = 465 then begin 
     TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False; 
    end; 
    end; 
end; 

TIdHTTPServerOnQuerySSLPort事件處理這個細節給你。該功能尚未被移植到其他Indy服務器組件,您必須手動完成。

您充當服務器客戶端決定是否啓動SSL/TLS會話,您不能從服務器端執行此操作。 IF客戶端想要使用端口25上的SSL/TLS,它將通過EHLO命令查詢您的服務器的功能,然後發送STARTTLS命令到您的服務器,如果它在其EHLO回覆中報告STARTTLSTIdSMTPServer爲您處理所有這些,您唯一需要做的就是將SSLIOHandler分配給服務器,並將TIdSMTPServer.UseTLS屬性設置爲utUseRequireTLSutUseExplicitTLS

+0

是否可以根據端口(端口465上的'utUseImplicitTLS'和端口25上的'utUseExplicitTLS')更改TIdSMTPServer.UseTLS屬性,或者必須在啓動時指定一次「SMTPServer」處於活動狀態的整個時間保持不變? – 2014-10-20 09:58:53

+0

「STARTTLS」命令(如果由客戶端發出)可以保證在端口25上加密的SSL/TLS連接嗎? – 2014-10-20 13:21:42

+1

是的,這就是'STARTTLS'的意思。客戶端連接未加密,在準備就緒時發送'STARTTLS',如果服務器接受它,而不是交換SSL/TLS握手,並且從該點開始所有內容都被加密。 – 2014-10-20 19:17:33

相關問題