7

在我的电子邮件检查器中,我支持 POP3 SSL 和 IMAP SSL。虽然使用 SASL 的 Pop3 SSL 已经工作了一段时间,但我从未让使用 SASL 的 IMAP SSL 工作,即使 POP3 和 IMAP 之间的 SASL 代码应该非常相似。我的理解是,在这个问题得到解决之前,我不应该期望它能够工作。嗯,这个问题已经解决了,所以我想再看看如何让 SASL 为 IMAP 工作。我已经更新并重建了 Indy,并取消了所有 SASL 代码的注释,现在我发现当我发出登录命令时,我在 IdIMAP4 中收到了读取超时(即使超时设置为大量时间(在大约 20-30 秒),这比使用 SASL 在 POP3 上进行身份验证所需的时间长约 5 倍。

单步执行调试器中的代码,导致读取超时的行出现在function PerformSASLLogin_IMAP(ASASL: TIdSASL; AEncoder: TIdEncoder;第 1358 行的函数中:

AClient.SendCmd(AClient.NewCmdCounter, 'AUTHENTICATE ' + String(ASASL.ServiceName), [], True); {Do not Localize} 

考虑到整个方法在该错误报告中指出的修订版中是新的,我很确定我已经成功更新了 Indy,并且我设置 SASL 机制的逻辑和其他类似的逻辑与 POP3 的工作原理非常相似(除了像使用 IMAP AuthType iatSASL 而不是 Pop3 AuthType patSASL)。那么为什么我会在这里收到读取超时?我如何排除故障是我的代码还是 Indy 不能正常工作?如果我将 IMAP.AuthType 更改为 iatUserPass 或 DEF_IMAP4_AUTH 连接成功。我似乎找不到关于我是否应该期望带有 IMAP 的 SASL 现在可以工作的最新信息,除了提示错误报告已被关闭为已修复。

编辑: 根据 Remy 在他的回复中的问题,这里是当我将它设置为在没有 SSL 的情况下与 SASL 连接时,wireshark 捕获的 TCP 对话:

* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot 准备好了。

C1 能力

* CAPABILITY IMAP4rev1 Literal+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE 儿童命名空间 UIDPLUS 列表扩展 I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS QUOTA STARTTLS AUTH=普通认证=登录

C1 OK 能力完成。

C2 认证普通

+

C3 登出

C2 NO [ALERT] 持续响应中的 base64 数据无效

4

1 回答 1

5

AFAIK,TIdIMAPSASL 现在工作正常(考虑到我是实现它的人)。我无法访问任何使用 SASL 的 IMAP 服务器,因此我无法自己实际测试它,但这是我在过去几个月中第一次听说它存在任何问题,即固定实现已经存在。

但是,如果没有看到实际的套接字流量,就无法知道服务器是否正在发送任何回复,或者是否TIdIMAP只是没有正确读取回复。您能否提供命令/响应的实际日志?要么使用数据包嗅探器,如 Wireshark,要么将 Indy 自己的TIdLog...组件之一附加到TIdIMAP.Intercept属性。

更新:这是TIdIMAP4.GetInternalResponse(). 它没有+正确处理线路。我已经检查了 Indy 的 SVN 的修复。

于 2013-08-01T22:25:03.497 回答