RFC 3501 states in section 6.1.2.您应该使用NOOP
命令进行轮询。
虽然在TIdIMAP4
中只有KeepAlive
方法使用它,但它是作为一个过程实现的,即不会返回任何内容。
那么如何检查状态更新,例如新消息或读取状态更改?即如何使用TIdIMAP4
进行手动轮询?这样做涉及哪些方法和属性?以及如何获取(U)ID这些消息?
或者甚至可以使用RFC 2177中指定的IDLE
命令来避免轮询并自动获取更新?
塞巴斯蒂安
答案 0 :(得分:3)
IMAP在技术上是一种异步协议,但TIdIMAP4
目前是作为同步客户端实现的。因此,意外/无序数据要么被丢弃,要么被视为未标记数据,要么被视为错误数据,具体取决于时间和上下文。可以从TIdIMAP4.LastCmdResult
属性访问未标记/额外数据,您可以将其输入到TIdReplyIMAP4
以访问其Extra
子属性。
IDLE
目前不支持 TIdIMAP4
。 Indy的问题跟踪器(请参阅here和here)中的门票可以在将来的版本中添加IDLE
支持,可能在Indy 11中。在此之前,您必须定期轮询邮箱信封,跟踪您已经看过的邮件,以便检测新邮件。
答案 1 :(得分:2)
是的,您可以使用IDLE
来避免NOOP
,一般来说这是一个好主意。
然而,这不会给你任何结果。在某种程度上,IMAP命令没有结果。他们告诉服务器你想要什么,服务器会告诉你什么。服务器也可以自由地告诉你其他原因,包括内心的善良。
您可能会说NOOP
表示“喜欢服务器,现在是告诉我事情的好时机,我正在倾听”而IDLE
表示“喜欢服务器,我一直在听,所以只要你想要,就告诉我你想做什么。两者也意味着“和btw,如果你有一个,重新启动你的不活动超时”。
服务器会向您发送EXISTS
,FETCH
和其他回复,我希望TIdIMAP4会以某种方式转发给您。 (是的,它们被称为响应,即使它们不响应您的任何命令。例如,它们可能会被发送以响应其他人向您发送邮件。愚蠢的命名。)