Вопрос по ruby-on-rails, ruby, email – Получение только новой почты с сервера IMAP

18

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

Я мог бы использовать SEARCH с SINCE DATE, но поддержка времени + даты не могла быть легко подделана.

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

Ваш Ответ

3   ответа
4

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

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

imap.search(["NOT", "SEEN"]).each do bla.bla.bla
спасибо, но мое приложение не единственное, которое имеет доступ к этой учетной записи электронной почты. Например, конкретное сообщение можно было прочитать в outlook и пометить как «увиденное». Использование "seen" заставит мое приложение пропустить его. Abhishiv Saxena
В этом случае вы можете просто перебрать заголовки Message-Id в почте на сервере и сравнить с тем, что имеется в базе данных. Freesoft.org / CIE / RFC / 850 / 10.htm JosefAssad
0

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

40

менно поэтому он был создан.

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

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

123456: *

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

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

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

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

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

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

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

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

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

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

да, это прекрасно! убедитесь, что вы запускаете команду «UID 123: *» вместо просто «123: *», которая возвращает неожиданные результаты - например. client.Folders.Inbox.Search ("UID 123: *") Simon_Weaver

Похожие вопросы