Сценарии IMAP сверх квоты

Я понимаю, что существует ряд библиотек для доступа к IMAP из Java, Python и т. д. Но то, что я хочу сделать, очень специфично и противоречит большинству примеров imap.

Легкие части:

  • Учитывая сервер IMAP, логин и конкретное имя папки
  • Уничтожить все сообщения в этой папке (или уничтожить папку, если это проще или эффективнее?)

Нетипичные части:

  • Выполнять удаление после каждого N удаления
  • Включите некоторую логику повторных попыток и размера пакета, чтобы загруженные серверы — даже удаление и удаление 100 сообщений за сеанс было бы полезным.
  • НЕ загружайте все заголовки!

Последний пункт - проблема. Каждый почтовый клиент, который я пробовал, задыхается при загрузке 20 000 заголовков электронной почты, которые мне не нужно видеть.

Для сценариев POP3 я только что дал последовательные идентификаторы, 1, 2, 3...

Но каждый пример IMAP, который я видел, использует какое-то поле, полученное из заголовков. Так может быть, для удаления сообщений IMAP требуется идентификатор, о котором вы не можете догадаться? (и можно получить, только выполнив запрос?)

Если мне действительно нужно было получить заголовки, можно ли сделать это хотя бы максимально компактным? Или позвольте мне сделать только 100 за раз?

В качестве альтернативы я пытался удалить всю папку через пользовательский интерфейс почтового клиента, но это, похоже, не работает. Я думаю, что он сначала пытается переместить все заголовки в корзину, и у него это не получается, поэтому никогда не доходит до части удаления. Поэтому я не уверен, что удаление папки на самом деле более эффективно, чем удаление ее содержимого.

Любые мысли оценены. Обычно я работаю на Java или Python, но я гибкий. Я думаю, что это проблема протокола, а не проблема библиотеки.


person Mark Bennett    schedule 27.03.2012    source источник


Ответы (2)


Предполагая, что вы не используете нетипичный сервер (например, gmail, который довольно нетипичен), вы можете выполнить эти команды после LOGIN и SELECT [папка]:

A001 STORE 1:N +FLAGS (\Deleted)
A002 EXPUNGE
A003 STORE 1:N +FLAGS (\Deleted)
A004 EXPUNGE

И так далее, где вы заменяете N размером партии. Это не будет использовать папку для мусора (если только ваш IMAP-сервер не имеет специальной логики, например Gmail: для gmail настройте параметры доступа IMAP).

Вы должны быть в состоянии сделать это:

A001 STORE 1:* +FLAGS (\Deleted)
A002 EXPUNGE

Хотя это может занять некоторое время.

Фактически, вы можете использовать такой инструмент, как socat, чтобы войти в систему и самостоятельно говорить по протоколу:

socat READLINE: OPENSSL:[server]:993,noverify,crlf
a LOGIN [user] "[password]"
b SELECT [folder]

А затем хранить и удалять команды сверху.

person Max    schedule 30.07.2012

спецификация IMAP содержит DELETE команда, которая может уничтожить весь почтовый ящик.

person sarnold    schedule 27.03.2012
comment
Спасибо @sarnold, хорошая информация, НО я не уверен, что это исправит. Допустим, в папке Junk_folder 100 000 сообщений, и я использую команду DELETE. Я подозреваю, что это будет проблематично для многих реализаций. Из того, что я видел, я думаю, что сервер IMAP запустит 100 000 команд копирования в корзину и установит флаг удаления для исходных 100 000 сообщений, так что теперь у вас будет 200 000 сообщений и какое-то время будет превышена квота. Только когда все это будет сделано, он удалит и вернет себе пространство, а вместо этого, скорее всего, задохнется. Мысли?? (Зависит от реализации, конечно) - person Mark Bennett; 29.03.2012
comment
Если ваша реализация не сломана, DELETE [папка] не должна приводить к перемещению всех сообщений в корзину. Папки для мусора не являются частью спецификации и в основном являются просто джентльменским контрактом с клиентами. Google — исключение: они много работают в фоновом режиме, но вы можете изменить настройки, чтобы сразу удалить. - person Max; 30.07.2012
comment
@Max: Спасибо за дополнительные подробности. - person sarnold; 02.08.2012