當嘗試使用 TLS v1.2 方法和使用的埠 465 連接到 SMTP 服務器時,我的程式無限掛起。我在mailbox.org(TLS 1.2 強制)上創建了一個測驗郵件帳戶并嘗試使用提供的資料。
環境:Delphi XE、Indy 10.6.2、OpenSSL 1.0.2u DLL 檔案在程式檔案夾中。
源代碼:
try
IdSMTPReport.IOHandler := FormMain.IdSSLIOHandlerSocketMail;
IdSMTPReport.UseTLS := utUseExplicitTLS;
IdSSLIOHandlerSocketMail.SSLOptions.Method := sslvTLSv1_2;
IdSMTPReport.Host := ###;
IdSMTPReport.Username := ###;
IdSMTPReport.Password := ###;
IdSMTPReport.Port := 465;
IdMessageReport.ContentType := 'text/plain; charset=UTF-8';
IdMessageReport.Sender.Address := IdMessageReport.From.Address;
IdMessageReport.Sender.Name := IdMessageReport.From.Name;
IdMessageReport.Recipients.Clear;
IdMessageReport.Recipients.EMailAddresses := ###;
IdMessageReport.Subject := 'Test';
IdMessageReport.Body.Clear;
IdMessageReport.Body := MailReport;
IdSMTPReport.Connect;
IdSMTPReport.Send(IdMessageReport);
IdSMTPReport.Disconnect;
except
try
IdSMTPReport.Disconnect;
except
end;
end;
Object Inspector 中的 IdSSLIOHandlerSocketMail 設定

它在向OnStatus/OnStatusInfo事件發送任何狀態文本/資訊訊息之前掛起。
SMTP 服務器可以使用給定的憑據正常作業。如果我嘗試使用 TLS 1.2 和埠 587 的另一臺服務器(1und1,德國 ISP),它作業正常。如果我更改為埠 465,則 10000 毫秒的超時(即使超時時間更長)會在不發送郵件的情況下生效:
狀態資訊:
Resolving hostname ###
Connecting to ###
Connected.
-> Timeout
Disconnected.
有任何想法嗎?
uj5u.com熱心網友回復:
您正在將該TIdSMTP.UseTLS屬性設定為utUseExplicitTLS. 這意味著TIdSMTP將以最初未加密的狀態連接到服務器,讀取服務器的問候語和功能,然后發送STARTTLS命令以請求允許發送 TLS 握手以啟動新的加密會話。
但是,埠 465 是 SMTP 的隱式TLS 埠。這意味著服務器將期望客戶端在連接后立即執行 TLS 握手,然后再交換任何 SMTP 資料,包括服務器的問候語。
因此,由于使用了錯誤的配置,您處于 catch-22 情況。通過使用utUseExplicitTLS,TIdSMTP正在等待服務器的未加密問候語。但是,通過使用埠 465,服務器正在等待客戶端的 TLS 握手。所以雙方都不滿足對方的等待條件,因此超時。
SMTP 的顯式TLS 埠改為 587。所以,你需要:
utUseImplicitTLS在埠 465 上使用。utUseExplicitTLS在埠 587 上使用。
除非服務器配置不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/389670.html
上一篇:TEdgeBrowser-OnNewWindowRequested-在另一個TEdgeBrowser中打開新視窗
