RFC 3501在第6.1.2节中说明。您应该使用NOOP
命令进行轮询。
虽然在TIdIMAP4
中只有KeepAlive
方法使用它,但它是作为过程实现的,即不返回任何内容。
那么,如何检查状态更新,例如新消息或读取状态更改?即,如何使用TIdIMAP4
进行手动轮询?这涉及到哪些方法和属性?如何获取这些消息的(U)ID?
或者,是否可以使用RFC 2177中指定的IDLE
命令来避免轮询并自动获得更新?
TIdIMAP4
目前是作为同步客户端实现的。因此,根据时间和上下文,意外/无序数据要么被丢弃,要么被视为未标记数据,要么被当作错误数据。可以从TIdIMAP4.LastCmdResult
属性访问未标记/额外的数据,您可以将其类型转换为TIdReplyIMAP4
以访问其Extra
子属性。
TIdIMAP4
当前不支持IDLE
。Indy的问题跟踪器中有一些票证(请参阅此处和此处),可以在未来的版本中添加IDLE
支持,可能在Indy 11中。在此之前,您必须定期轮询邮箱信封,跟踪您已经看到的邮件,以便检测新邮件。
是的,您可以使用IDLE
来避免使用NOOP
,通常这是一个好主意。
然而,这不会给你任何结果。在某种程度上,IMAP命令没有结果。它们告诉服务器你想要什么,服务器告诉你一些事情。服务器也可以出于其他原因自由地告诉你一些事情,包括它内心的善良。
你可能会说NOOP
的意思是"嗨,服务器,现在是告诉我事情的好时机,我在听",IDLE
的意思是:"嗨,我一直在听,所以只要你想告诉我什么就告诉我什么"。两者的意思都是"顺便说一句,如果有不活动超时,请重新启动"。
服务器将向您发送EXISTS
、FETCH
和其他响应,我希望TIdIMAP4以某种方式转发给您。(是的,它们被称为响应,即使它们不是对你的任何命令的响应。例如,它们可能是对其他人向你发送邮件的响应。愚蠢的命名。)