在我的电子邮件检查程序中,我同时支持POP3 SSL和IMAP SSL。虽然POP3 SSL使用SASL已经运行了一段时间,但我从未让使用SASL的IMAP SSL正常工作过,尽管SASL代码在POP3和IMAP之间应该非常相似。我的理解是,在修复此问题之前,我不应该期望它能正常工作。好吧,这个问题已经解决了,所以我想再次尝试使SASL适用于IMAP。我已经更新和重建了Indy,并取消注释了所有的SASL代码,现在我发现当我发出登录命令时,我在IdIMAP4中得到了读取超时(即使将超时设置为足够长的时间(大约20-30秒左右),大约比使用SASL进行身份验证要花费的时间长5倍)。通过调试器逐步执行代码,看起来导致读取超时的行是函数
考虑到整个方法是在那个错误报告中指示的修订版中新出现的,我非常确定我已经成功更新了Indy,并且我设置SASL机制等逻辑与POP3非常相似(除了使用IMAP AuthType iatSASL而不是Pop3 AuthType patSASL之类的事情)。那么为什么我在这里会得到读取超时?我怎样才能排除是我的代码还是Indy本身出了问题呢?如果我将IMAP.AuthType更改为iatUserPass或DEF_IMAP4_AUTH,连接就会成功。除了暗示错误报告已关闭之外,我似乎找不到有关我是否应该期望IMAP中的SASL正在运行的最新信息。
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在他的回复中提出的问题,以下是Wireshark捕获的TCP对话记录,当我将其设置为不使用SSL连接SASL时:
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
C1 CAPABILITY
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS QUOTA STARTTLS AUTH=PLAIN AUTH=LOGIN
C1 OK Capability completed.
C2 AUTHENTICATE PLAIN
+
C3 LOGOUT
C2 NO [ALERT] Invalid base64 data in continued response
TIdIMAP4.SendCmd()
没有正确处理+
行,因此它忽略了该行并尝试读取另一行,而实际上服务器并没有发送该行,因此出现了超时。我正在研究原因。 - Remy Lebeau