2013-04-28 4 views
1

Используя API JavaMail и IMAP, я хочу узнать, что сообщение было перемещено из папки a в b. как я могу это сделать без добавления слушателей? Я хочу, чтобы я обнаружил изменения в сообщениях, когда я вхожу в учетную запись и открываю папку.Рассылка с помощью IMAP: как определить, что сообщение было перемещено из одной папки в другую?

Проблема заключается в том, что у вас есть 3 сообщения в папке a с идентификаторами 1 2 и 3, и вы перемещаете сообщение с идентификатором 3 в папку B, идентификатор сообщения изменяется, и у нас есть сообщение с идентификатором 1 в папке B.

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

я могу получить новые или непрочитанные письма по:

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.RECENT), true)); 

или

Message messages[] = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false)); 

, но я не заинтересован только новых писем, я также хотел бы знать изменения, внесенные в старый mail, например, я хочу получить информацию об этом:

почта, которая была прочитана 2 месяца назад, была перемещена в другую папку.

моя идея,

потому что UIDs изменить, я не могу использовать это для идентификации сообщений. Я думаю, что мне нужно использовать информацию о почте, такую ​​как дата получения отправителя субъекта, построить хэш-значение из них и сравнить хэш-значения сообщений при каждом входе в систему. но это вызовет проблемы с производительностью.

ответ

2

вы можете попробовать использовать информацию заголовка rfc822, в которой содержится идентификатор сообщения, например [email protected], который не должен меняться при перемещении почты в папки. но вам придется сканировать все почтовые заголовки пользователя, чтобы синхронизировать это, по крайней мере, я не знаю способа извлечения перемещенных сообщений.

+1

был готов ответить именно на это. Идентификатор сообщения - это точно подходящее поле для использования ... конечно, нужно учитывать, что письма * копируются * в несколько папок, а не во всех сообщениях есть идентификаторы сообщений (черновики ...?) – rolfl

+0

Не все сообщения имеют заголовок '' Message-Id'', и этот заголовок, к сожалению, не гарантированно является уникальным. Когда дело доходит до интернет-протоколов и RFC, вы не можете полагаться на формулировку '' SHOULD''. –

+0

но эта страница говорит: http://stackoverflow.com/questions/219343/get-uid-for-message-from-gmail-using-javax-mail-with-imap?rq=1 Идентификатор сообщения является уникален в большинстве, но не во всех случаях.Особенно автоматические отправители часто генерируют один и тот же идентификатор, или у вас его нет (я также видел пустые сообщения - Message-ID:) – benchpresser

4

Вы не можете сделать это в IMAP. Отслеживание заголовка Message-Id может получить вас на полпути, но вам придется добавлять всевозможные проверки для таких угловых случаев, как дубликаты идентификаторов сообщений (да, они предположительно, чтобы быть уникальными) и т. Д. Также имейте в виду, что базовый IMAP дает вам хорошо синхронизированный вид на один почтовый ящик, а не атомный вид на набор почтовых ящиков при объединении. Это означает, что даже если пользователь «переместил» сообщение между папками A и B, он вполне может быть видимым как для A, так и для вашего сценария в течение более длительного периода времени.

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

+0

при использовании thunderbird, когда я создаю папку из другого инструмента и перемещаю очень старую messsage в новую папку, thunderbird сразу же получает новую папку и новое сообщение при нажатии на папки. знает ли thunderbird, что, взяв все сообщения от начала и применив какой-то сорт, или почтовый сервер предоставляет определенную информацию, такую ​​как x, переместился с a на b? – benchpresser

+0

Я проверил его с почтовым аккаунтом с 2000 сообщениями. когда я перемещаю очень старое сообщение из своей папки в другую папку (другой почтовый клиентский инструмент, отличный от thunderbird, веб-механизм qmail, белковая почта), и когда я нажимаю на папку на thunderbird, перемещаемое сообщение исчезает. как может thunderbird узнать, что так быстро? – benchpresser

+1

Вы спрашивали о том, как обнаружить «ходы». IMAP предоставляет только информацию о «сообщении A, исчезающем из почтового ящика X» и «сообщении B, появляющемся в почтовом ящике Y». Нет простого и надежного способа обнаружить, что A == B. Существует расширение '' UIDPLUS'', которое может помочь при определенных обстоятельствах, но это далеко не полное решение. –

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