Эффективно проверять непрочитанный счет на весь аккаунт - PullRequest
2 голосов
/ 23 марта 2011

Насколько я понимаю, нет способа запросить всю учетную запись IMAP для общего непрочитанного количества или UID всех последних сообщений, независимо от почтового ящика.Для того, чтобы получить общее число непрочитанных для учетной записи, вам нужно перебрать все mboxes и проверить их статус.Я сделал это, но это очень медленно (45 секунд на одной из моих учетных записей со многими почтовыми ящиками).

Mail.app может найти новые сообщения, даже в глубоко вложенных почтовых ящиках, всего за пару секунд.

Является ли скорость здесь только ограничением использования Net :: IMAP?Или я упускаю некоторые функции, которые возвращают более ограниченный набор почтовых ящиков, например, только те, которые имеют ПОСЛЕДНИЕ сообщения?

Единственный другой вариант, о котором я могу подумать, - использовать обработчики ответов, а также хранить кэш, из которогоУ mbox есть счетчик> 1, а затем проверять только комбинацию из двух в каждом цикле.Но так как я собираюсь сделать это в сценарии, было бы идеально исключить необходимость переноса кэша, если не требуется.

1 Ответ

3 голосов
/ 23 марта 2011

Канонический способ обнаружения новых сообщений в IMAP - через UIDNEXT. Выдача

A001 STATUS "foldername" (UIDVALIDITY UIDNEXT)

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

Уникальные идентификаторы присваиваются строго по возрастанию в почтовом ящике; как каждый сообщение добавляется в почтовый ящик, ему присваивается более высокий UID, чем сообщение (я), которые были добавлены ранее. В отличие от последовательности сообщений числа, уникальные идентификаторы не обязательно являются смежными.

Следующим уникальным значением идентификатора является прогнозируемое значение, которое будет назначено новое сообщение в почтовом ящике. Если только Действительность идентификатора также изменяется (см. ниже), следующий уникальный Значение идентификатора ДОЛЖНО иметь следующие две характеристики. Первый, следующее значение уникального идентификатора НЕ ДОЛЖНО изменяться, если нет новых сообщений добавляются в почтовый ящик; и, во-вторых, следующий уникальный идентификатор значение ДОЛЖНО изменяться всякий раз, когда новые сообщения добавляются в почтовый ящик, даже если эти новые сообщения впоследствии будут удалены.

Так что просто следите за ожидаемым следующим UID каждой папки и значением валидности UID. Если команда STATUS приводит к изменению UIDNEXT или UIDVALIDITY от вашего кэшированного значения, вы знаете, что вам нужно проверить наличие новой почты (если первая) или выполнить повторную синхронизацию (если последняя).

Примерно так :

imap.status("foldername", ["UIDNEXT", "UIDVALIDITY"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...