Время ожидания простоя IMAP

Скажем, я использую IMAP IDLE для мониторинга изменений в почтовой папке.

В спецификации IMAP указано, что соединения IDLE должны оставаться в живых только на 30 минут, но рекомендуется выбрать меньшее количество минут - скажем, 20 минут, затем отменить простоя и перезапустить.

Мне интересно, что произойдет, если содержимое почты изменится между отменой простоя и созданным новым простоя. Возможно, электронное письмо может быть пропущено. Учитывая, что RECENT немного расплывчато, это может привести к получению списка сообщений до того, как закончится старый простоя, и начнется новый простоя.

Но это почти то же самое, что и опрос каждые 20 минут, и проигрывает часть пользы от простоя.

В качестве альтернативы, новый сеанс бездействия может быть запущен до завершения истечения срока действия.

Но в любом случае, я думаю, эта проблема уже решена, поэтому здесь я прошу рекомендации.

Спасибо,

Пол

Ответ 1

Как вы знаете, целью команды IMAP IDLE (RFC 2177) является предоставление обновлений статуса передачи сервера клиент в режиме реального времени. В этом контексте обновления состояния означают немедленные ответы IMAP-сервера, такие как EXISTS, RECENT, FETCH или EXPUNGE, которые отправляются при поступлении новых сообщений, обновлении состояния сообщения или удалении сообщения.

Однако эти обновления статуса IMAP могут быть возвращены любой командой IMAP, а не только командой IDLE - например, командой NOOP (см. RFC 3501 раздел 6.1.2) можно также использовать для опроса для обновлений сервера (он предшествует команде IDLE). IDLE только позволяет получать эти обновления более эффективно - если вы не используете команду IDLE, обновления сервера будут просто отправляться сервером, когда клиент выполняет другую команду (или даже когда в некоторых случаях не выполняется команда) подробнее см. RFC 3501 в разделе 5.2 и 5.3.

Это означает, что если сообщение изменено между отменой IDLE и новой командой IDLE, обновления статуса не должны быть потеряны, так как они не потеряны, если вы никогда не использовали IDLE в первую очередь (и используйте NOOP каждый раз секунды, например) - их следует просто отправить после запуска новой команды IDLE.

Ответ 2

Другим подходом было бы помнить последний самый высокий uid контролируемой папки. Всякий раз, когда вы думаете, есть шанс, что вы пропустили обновление. Сделайте поиск следующим образом: *