2012-05-21 2 views
1

У меня есть учетная запись imap (например, [email protected]), и я знаю много библиотек, с которыми я могу подключаться и реплицировать сообщения обратно в пункт назначения. Я хочу, чтобы достичь следующего,Синхронизировать (копировать) сообщения IMAP

  1. Первого раза, я хочу, чтобы загрузить все сообщения (в том числе отправленных папок), и когда я скачиваю в первый раз, я спасу сообщение с ID и UID локально в некоторой базе данных.
  2. Во второй раз я не хочу запрашивать загруженные сообщения, даже если их состояние чтения/непрочтения или любой флаг или удаленный флаг изменены или они очищены.
  3. Наша цель - загрузить и синхронизировать каждое сообщение локально, один раз и только в первый раз.

Теперь я мало знаю о сообщении IMAP о том, что у них есть что-то под названием ID, UID и MessageID. ID, вероятно, является смещением в текущей папке, UID - это числовой идентификатор в текущей учетной записи, а MessageID - уникальная строка.

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

Я планирую использовать библиотеку http://mailsystem.codeplex.com/, и она дает возможность поиска с пользовательской строкой и возвращает массив int.

Предполагая, что у меня есть MaxID, и я хочу только загружать сообщения с ID или UID больше, чем MaxID. Какой из них я должен использовать? UID или ID?

ответ

3

Вы должны использовать UID в комбинации с UIDVALIDITY. Оба значения зависят от папки.

Существует информационный RFC, который описывает, как клиенты IMAP должны выполнять синхронизацию (RFC-4549, раздел 4.3). Текст рекомендует выдавать следующие две команды:

tag1 UID FETCH <lastseenuid+1>:* <descriptors> 
tag2 UID FETCH 1:<lastseenuid> FLAGS 

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

AFAIK этот метод широко используется. Поэтому многие серверы IMAP содержат оптимизацию, чтобы быстро предоставлять эту информацию. Как правило, пропускная способность сети является ограничивающим фактором.

+0

Предполагая наличие двух папок, входящих и спамов, с 1000 и 100 в UID в своих папках. Теперь, если между двумя временами синхронизации, если сообщение с UID 101 получено в спаме, и пользователь переводит его во входящие, что происходит с UID? это сообщение получает новый UID с 1001? –

+0

IMAP не поддерживает операции перемещения, вместо этого электронные письма должны быть скопированы в целевую папку и удалены из исходной папки. UID уникален в папке, и когда электронное письмо добавляется или копируется в папку, электронное письмо получает UID, который больше, чем все предыдущие UID, используемые в этой папке. – nosid

+0

Также я узнал о поиске. Будет ли лучше синхронизироваться на ежедневной основе? Я хочу свести к минимуму поездки на сервер, почему мне нужно заботиться о UIDVALIDITY? –

Смежные вопросы