Подтвердить что ты не робот

Получение только новой почты с сервера IMAP

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

Я мог бы использовать ПОИСК с SINCE DATE, но нет поддержки времени + даты, которую можно легко подделать.

Я также попробовал флаг RECENT, но, похоже, он не работает с gmail (в рубине он показывает каждый раз каждый раз).

4b9b3361

Ответ 1

Вы хотите использовать UniqueId (UID) для сообщений. Именно поэтому он был создан.

Вам нужно будет отслеживать последний запрошенный UID, а затем, чтобы запросить все новые сообщения, вы используете набор сообщений "[UID]: *", где [UID] является фактическим значением UID.

Например, можно сказать, что последнее сообщение feteched имеет уникальный идентификатор "123456". Вы получите

123456: *

Затем отбросьте первое возвращенное сообщение.

UID "предположительно" должны быть стабильными во всех сессиях и никогда не меняться и всегда увеличиваться. Уловкой для проверки этого является проверка UIDValidity при выборе папки. Если номер UIDValidity не изменился, тогда UID должны быть действительны во всех сеансах.

Вот соответствующие части RFC:

2.3.1.1. Атрибут сообщения уникального идентификатора (UID)

32-битное значение, присвоенное каждому сообщению, которое при использовании с  значение уникальности идентификатора (см. ниже) формирует 64-битное значение  которые НЕ ДОЛЖНЫ ссылаться на любое другое сообщение в почтовом ящике или  следующий почтовый ящик с тем же именем навсегда. Уникальные идентификаторы  назначаются строго по возрастанию в почтовом ящике; как каждый  сообщение добавляется в почтовый ящик, ему присваивается более высокий UID, чем  сообщение (сообщения), которые были добавлены ранее. В отличие от последовательности сообщений  числа, уникальные идентификаторы не обязательно должны быть смежными.

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

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

Вот ссылка с дополнительной информацией:

http://www.faqs.org/rfcs/rfc3501.html

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

Ответ 2

Там флаг imap называется "увиденным". Большинство клиентов отмечают сообщение, просматриваемое при просмотре сообщения, поэтому вы хотите перебирать сообщения на сервере, которые не имеют этого флага.

Вот фрагмент кода, который должен дать вам правильную идею. Оперативный бит, конечно,

imap.search(["NOT", "SEEN"]).each do bla.bla.bla

Ответ 3

Если вы можете фильтровать входящую почту в определенную папку IMAP на стороне сервера, ваше приложение может читать новые сообщения в этой папке, а затем переместить их в стандартную папку INBOX после ее завершения.