在我的电子邮件检查器中,我同时支持POP3 SSL和IMAP SSL.虽然使用SASL的Pop3 SSL已经工作了一段时间,但我从未使用SASL来使用IMAP SSL,即使SASL的代码在POP3和IMAP之间应该非常相似.我的理解是,在
this issue修复之前我不应该期望它能够工作.好吧,这个问题已得到解决,所以我想我会再次考虑让SASL为IMAP工作.我已经更新并重建了Indy,并取消注释了我所有的SASL代码,现在我发现当我发出Login命令时,我在IdIMAP4中获得了读取超时(即使将超时设置为大量的时间(在20-30秒的邻域,比使用SASL在POP3上进行身份验证的时间长约5倍.
单步执行调试器中的代码,导致读取超时的行出现在函数函数PerformSASLLogin_IMAP中(ASASL:TIdSASL; AEncoder:TIdEncoder;在行1358上:
AClient.SendCmd(AClient.NewCmdCounter,'AUTHENTICATE ' + String(ASASL.ServiceName),[],True); {Do not Localize}
考虑到整个方法在bug报告中指出的修订中是新的,我很确定我已经成功更新了Indy,而且我建立SASL机制的逻辑和什么与POP3的工作非常相似(除了类似的东西)使用IMAP AuthType iatSASL而不是Pop3 AuthType patSASL).那么为什么我会在这里获得读取超时?我怎么能解决这是我的代码或Indy不能正常工作?如果我将IMAP.AuthType更改为iatUserPass或DEF_IMAP4_AUTH连接成功.我似乎无法找到有关我是否应该期望SASL与IMAP一起工作的最新信息,除了暗示错误报告被关闭为固定.
编辑:
Per Remy在他的回复中提出的问题是,当我将其设置为在没有SSL的情况下连接SASL时,由wireshark捕获的TCP对话:
* 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
解决方法
AFAIK,TIdIMAP SASL现在工作正常(考虑到我是实施它的人).我无法访问任何使用SASL的IMAP服务器,因此我自己无法对其进行实际测试,但这是我在过去几个月中第一次听说过固定实现存在的任何问题.
但是,如果没有看到实际的套接字流量,就无法知道服务器是否正在发送任何回复,或者TIdIMAP是否正在正确读取回复.您能提供命令/响应的实际日志吗?要么使用像Wireshark这样的数据包嗅探器,要么将Indy自己的TIdLog …组件之一连接到TIdIMAP.Intercept属性.
更新:这是TIdIMAP4.GetInternalResponse()中的错误.它没有正确处理线路.我已经检查了Indy的SVN.