Синхронизация IMAP

Я реализую IMAP-клиент, и у меня проблема с синхронизацией почтовых ящиков IMAP.

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

Должен ли я получать все сообщения с сервера и сравнивать его с локальными данными для синхронизации?

Ответ 1

Обычный подход заключается в выполнении следующих двух команд для каждой папки:

. EXAMINE "<foldername>"
. FETCH 1:* (UID FLAGS)

Первая команда выбирает папку, которая возвращает UIDVALIDITY этой папки. Если это значение соответствует ранее полученному UIDVALIDITY для этой папки, вы можете положиться на UID. Вторая команда возвращает (по крайней мере) UID и все FLAGS для каждой почты в выбранной папке.

  • Вы должны использовать UID для определения того, какие письма были добавлены или удалены. Обратите внимание, что содержимое электронной почты не может быть изменено без изменения UID.
  • В базовом IMAP FLAGS являются единственными атрибутами, которые можно изменить для электронной почты. Флаги содержат информацию о чтениях почты (\Seen) и удаленных письмах (\Deleted).

Этот подход используется большинством клиентов, и большинство IMAP-серверов оптимизированы для них. Ограничивающим фактором обычно является доступная пропускная способность между клиентом и сервером.

Следующие ситуации немного сложнее:

  • Что делать, если UIDVALIDITY не соответствует? Спецификация IMAP требует, чтобы серверы делали все возможное, чтобы избежать ненужных изменений этого значения.
  • Должна ли быть оптимизация для перемещенных писем (фактически скопированных писем)? В базовом IMAP вы не можете обнаружить, что электронное письмо является копией другого электронного письма - независимо от того, существует ли электронная почта в исходной папке или она уже удалена и удалена.

Ответ 2

Возможно, слишком поздно для вашего приложения, но вы можете найти полную стратегию синхронизации IMAP в этом RFC: http://tools.ietf.org/html/rfc4549!