2013-05-22 4 views
2

Я создаю приложение PHP для синхронизации почтового ящика IMAP с локальной копией. Мне нужно найти способ загрузки только сообщений из папок IMAP, которые я еще не загрузил.PHP IMAP sync a folder

PHP IMAP-библиотека имеет функцию imap_search, чтобы сделать что-то подобное. Например, imap_search ($ conn, 'SINCE "8 августа 2012 г.", SE_UID);

Однако это решение не работает. Часто электронные письма имеют неправильную дату (может быть будущая дата), а синхронизация работает неправильно.

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

ответ

3

Если вы выбираете из наименьшего UID наивысший UID (и новые сообщения в папке всегда имеют более высокий UID, чем любое предыдущее сообщение), то вы можете выполнить поиск по UID <uid>:*, где uid - это больше, чем самый высокий UID, который вы в настоящее время есть.

+0

+1 Я считаю, что спецификация требует, чтобы UID на сервере монотонно увеличивались. – tripleee

+0

Вы уверены, что все IMAP-серверы имеют UID как целые числа? Для меня кажется, что некоторые серверы могут иметь идентификаторы как уникальный текстовый код. но я не уверен в этом. –

+0

Нет, спецификация IMAP указывает, что UID всегда увеличивают целые числа. Серверы POP3 могут иметь текстовые uids. – Max

0

Я нашел описание UID в спецификации IMAP

«32-битное значение, присвоенное каждое сообщение, которое, когда используется с уникальным значением идентификатора действия (см ниже) формирует 64-битное значение, которое должны НЕ ссылаться на любое другое сообщение в почтовом ящике или на любой последующий почтовый ящик с тем же именем навсегда. Уникальные идентификаторы назначаются строго по возрастанию в почтовом ящике, так как каждое сообщение добавляется в почтовый ящик, ему присваивается более высокий UID, чем сообщение (s), которые были добавлены ранее. В отличие от порядковых номеров сообщений, уникальные идентификаторы не обязательно должны быть смежными ».

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

+0

Вам также придется учитывать изменения '' UIDVALIDITY''. –