【问题标题】:Indy IMAP4 over SSL基于 SSL 的 Indy IMAP4
【发布时间】:2012-09-19 15:22:39
【问题描述】:

我使用 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: 收到的命令处于无效状态。

|IdReplyIMAP4.pas   |TIdReplyIMAP4   |RaiseReplyError               |242[1]  |
|IdTCPConnection.pas|TIdTCPConnection|RaiseExceptionForLastCmdResult|576[1]  |
|IdIMAP4.pas        |TIdIMAP4        |Login                         |1970[29]|
|IdIMAP4.pas        |TIdIMAP4        |Connect                       |2019[28]|

这似乎是一个身份验证失败的消息,虽然我不知道为什么。

【问题讨论】:

    标签: delphi imap indy


    【解决方案1】:

    尝试使用sslvTLSv1 而不是sslvSSLv23

    【讨论】:

    • 恐怕没有工作,仍然收到“启动 SSL 协商失败”错误消息。我已经用 Indy 版本 (10.5.8.0) 更新了这个问题。将 143 端口与 RequireTLS 一起使用是否正确?
    【解决方案2】:

    已修复!

    两个关键设置错误:

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

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

    【讨论】:

    • 143 是普通的未加密 IMAP 端口。 993 通常用于 IMAP 加密。你可能想和服务器管理员谈谈。
    【解决方案3】:

    最新的 Indy 10 版本在 TLS、SSL、IMAP、SMTP 和 SASL 方面的性能比 Delphi 2007 中发布的要好得多。哎呀,Delphi 2007 在某个时候发布于 2006 年,因此 Indy 10 版本是2006 年的快照,那是六年前的事了。

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

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

    【讨论】:

    • Delphi 2007 附带 10.2.3,我们已经更新到 10.5.8.0,不确定最新版本是什么。不过我会检查 dll 和端口。
    • 我的 SSL dll 是最新版本。
    • 最新版本为 10.5.9 SVN rev 4810。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2014-12-11
    • 2013-03-01
    • 2016-03-31
    • 2014-03-28
    相关资源
    最近更新 更多