我使用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 dlls(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 NOT 可用(我原本期望TLSNotAvailable提出
EIdTLSClientTLSNotAvailable.Create(RSTLSSLSSLNotAvailable);
而不是
EIdTLSClientTLSNotAvailable.Create(RSTLSSLSSLCmdFailed);
但这让我想知道电子邮件服务器是否不支持TLS,至少在端口143上。)
如果我不使用TLS,我会得到: EIdReplyIMAP4Error:在无效状态下收到命令。
|IdReplyIMAP4.pas |TIdReplyIMAP4 |RaiseReplyError |242[1] |
|IdTCPConnection.pas|TIdTCPConnection|RaiseExceptionForLastCmdResult|576[1] |
|IdIMAP4.pas |TIdIMAP4 |Login |1970[29]|
|IdIMAP4.pas |TIdIMAP4 |Connect |2019[28]|
这似乎是一个身份验证失败的消息,虽然我不确定原因。
答案 0 :(得分:1)
尝试使用sslvTLSv1
代替sslvSSLv23
。
答案 1 :(得分:1)
固定!
两个关键设置错误:
FIdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
FIMAP4.UseTLS := utUseImplicitTLS;
设置这些(仍在端口143上)解决了这个问题。
答案 2 :(得分:0)
最新的Indy 10版本在TLS,SSL,IMAP,SMTP和SASL方面比在Delphi 2007中提供的版本好得多。哎呀,Delphi 2007在某些时候出货,所以Indy 10版本是从2006年开始的快照,即六年前的情况。
升级您的Indy10源,然后尝试不同的SSL选项。
您可能还有一个错误的SSL(ssleay,libssl)DLL版本。使用Indy页面上推荐的版本。