在我的电子邮件检查器中,我支持 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 数据无效