Indy IMAP4 over SSL

3

我使用Delphi 2007和Indy 10 (10.5.8.0)编写了一个Windows服务,通过IMAP连接到电子邮件服务器,读取10封电子邮件进行处理并断开连接。这个过程会在一天中多次重复。

只要服务没有使用SSL/TLS连接,这个方法就可以正常工作。

当使用TLS进行连接时,第一次连接似乎可以成功,但在后续尝试中会出现“start SSL negotiation failed”错误。

我在我的服务中使用以下Indy设置:

FIMAP4.Port := 143
FIMAP4.UseTLS := utUseRequireTLS;
FIdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;

电子邮件服务器运行Exchange 2010,使用TLS协议在端口143上运行,使用SSL协议在端口993上运行。我正在使用最新版本的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不可用(我本来希望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]|

这似乎是一个身份验证失败的消息,尽管我不确定原因。
3个回答

1

尝试使用sslvTLSv1代替sslvSSLv23


很抱歉,还是不行,仍然会出现“开始SSL协商失败”的错误提示。我已经更新了问题并提供了Indy版本(10.5.8.0)。使用端口143和RequireTLS是否正确? - SteB

1

问题已解决!

有两个关键设置错误:

FIdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
FIMAP4.UseTLS := utUseImplicitTLS;

设置这些(仍在端口143上)解决了问题。


143 是普通的未加密 IMAP 端口。而 993 则通常用于 IMAP 加密。你可能想与服务器管理员谈论这个问题。 - Remy Lebeau

0

最新的Indy 10版本在TLS、SSL、IMAP、SMTP和SASL方面比Delphi 2007中提供的版本要好得多。实际上,Delphi 2007是在2006年发布的,因此Indy 10版本是六年前的快照。

升级您的Indy10源代码,然后尝试不同的SSL选项。

您可能还有一个错误的SSL(ssleay、libssl)DLL版本。请使用Indy页面推荐的版本。


Delphi 2007发行版搭载了10.2.3版本,我们已经更新到了10.5.8.0版本,不确定最新版本是什么。我会检查dll和端口的。 - SteB
我的SSL dlls是最新版本。 - SteB
最新版本是10.5.9 SVN rev 4810。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接