我使用 Indy 10 (10.5.8.0) 在 Delphi 2007 中编写了一个 Windows 服务,该服务通过 IMAP 连接到电子邮件服务器并读取 10 封电子邮件,处理它们并断开连接。这会在一天中重复。只要服务不使用 SSL/TLS 连接,它就可以正常工作。
使用 TLS 连接时,它似乎第一次工作,但在随后的尝试中给出“启动 SSL 协商失败”错误。我在我的服务中使用以下 Indy 设置:
FIMAP4.Port := 143
FIMAP4.UseTLS := utUseRequireTLS;
FIdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
电子邮件服务器运行 Exchange 2010,并在端口 143 上运行 TLS,在端口 993 上运行 SSL。我使用的是最新版本的 ssl dll (1.0.1.3)。
我正在断开连接:
FIMAP4.IOHandler.InputBuffer.Clear;
FIMAP4.Disconnect;
更新:
从 EurekaLog 中提取:
|IdExplicitTLSClientServerBase.pas|TIdExplicitTLSClient|TLSNotAvailable |416[4] |
|IdExplicitTLSClientServerBase.pas|TIdExplicitTLSClient|TLSNotAvailable |412[0] |
|IdExplicitTLSClientServerBase.pas|TIdExplicitTLSClient|ProcessTLSNotAvail|342[2] |
|IdExplicitTLSClientServerBase.pas|TIdExplicitTLSClient|ProcessTLSNotAvail|341[1] |
|IdIMAP4.pas |TIdIMAP4 |Login |1957[16]|
|IdIMAP4.pas |TIdIMAP4 |Connect |2019[28]|
这似乎表明 TLS不可用(我原以为 TLSNotAvailable 会引发
EIdTLSClientTLSNotAvailable.Create(RSTLSSLSSLNotAvailable);
而不是一个
EIdTLSClientTLSNotAvailable.Create(RSTLSSLSSLCmdFailed);
但这让我想知道电子邮件服务器是否不支持 TLS,至少在端口 143 上)。
如果我不使用 TLS,我会收到:EIdReplyIMAP4Error: Command received in Invalid state。
|IdReplyIMAP4.pas |TIdReplyIMAP4 |RaiseReplyError |242[1] |
|IdTCPConnection.pas|TIdTCPConnection|RaiseExceptionForLastCmdResult|576[1] |
|IdIMAP4.pas |TIdIMAP4 |Login |1970[29]|
|IdIMAP4.pas |TIdIMAP4 |Connect |2019[28]|
这似乎是一个身份验证失败的消息,虽然我不知道为什么。