2015-05-10 2 views
2

Я буду использовать java mail api для обработки писем, таких как thunderbird и т. Д. Я должен получать почту с 1000 сообщениями. Мой дизайн будет: Когда пользователь выполняет синхронизацию на папке, я буду получать все идентификаторы из сообщений в папке:java imap, проблемы с производительностью, выборка всех почтовых сообщений

Message[] msgs = ufolder.getMessagesByUID(1, UIDFolder.LASTUID); 
// Use a suitable FetchProfile 
FetchProfile fp = new FetchProfile(); 
fp.add(FetchProfile.Item.ENVELOPE); 
fp.add(FetchProfile.Item.FLAGS); 

Я Виль затем сравнить список с жидкостями списка хранится в моей БД. Для удаленных, например, сообщение не находится в папке, но в db, я помечаю его как удаленный. Для новых, например, сообщение находится в папке, но не в db, я буду отмечать как можно новые. Но, поскольку messageuids небезопасны (могут быть изменены почтовым сервером в некоторых случаях), для новых писем я буду использовать additioanlly настраиваемое значение хэш-значения из идентификатора сообщения в заголовке + субъект + полученное и построить хэш-таблицу md5. Только для возможных новых писем я буду использовать этот хеш и поймать новые письма. Для перемещенных сообщений, поскольку их uids будут изменены в новой папке, они будут помечены как удаленные в первом и будут новым сообщением в новой папке, но сообщение будет иметь одно и то же пользовательское значение хеш-значения. заголовок и другие свойства останутся такими же, как и движение.

Вопрос о проблеме с производительностью: При каждом нажатии на папку (синхронизация папок) я буду выполнять операцию сравнения всех uid в папке с локальным списком uid, хранящимся в db, для изучения удаленных. Я не мог найти другого лучшего способа добиться этого. Как вы знаете, thunderbird немедленно удаляет удаленное сообщение без переписки, даже если папка большая, а удаленное сообщение очень старое (5 лет). Я думаю, что thunderbird также сравнивает все сообщения uids в этой папке со списком, хранящимся локально.

Как я могу реализовать лучший механизм синхронизации для лучшей производительности? Использует ли thunderbird другой подход? Как может thunderbird выполнить его так быстро?

Если бы нас интересовали только новые сообщения, я мог бы сохранить последний сохраненный uid и только сравнить новые сообщения позже этого, но для удаленных я уже должен сравнивать полную папку. Кроме того, значение UIDNEXT всегда равно -1 на моем почтовом сервере, если оно было установлено правильно, это не поможет снова удалить удаленные, полное сравнение - это, должно быть, я думаю, я ошибаюсь?

Примечание: Я не Канот использовать или добавить сообщение слушателей, потому что appliaction основан клиент-сервер и задача обработки почты на стороне сервера, и мы не поддерживаем нити слушателей и т.д. События должны быть вызваны из клиент и запрос обрабатываются на сервере, и ответ возвращается, а клиент обрабатывает ответ на gui.

ответ

0

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

+0

Выполняют ли почтовые клиенты, например, прослушиватели регистров tbird, и получают ли они уведомление об удалении писем или выполняют полную проверку uids и сравнивают со списком uids, хранящимся локально текущей папки, когда пользователь запускает обновление или синхронизацию? – benchpresser

+0

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

+1

Но, на начальном этапе, при первом входе в систему они должны как-то получить список и сравнить с локальным. С другой стороны, мы не можем всегда полагаться на слушателей, а imap-idle поддерживает автономную работу. И что происходит, мы подключаемся к почтовому серверу и прослушиваем, почта получена, но наша сеть отключена на короткий период, почтовый сервер уведомил нас, но мы этого не получили. Что происходит, когда мы снова подключаемся? Повторяет ли почтовый сервер событие? Подождите ли мы от нас, и если он не получен, он отправит событие снова? – benchpresser

3

Что вы хотите, так называемый condstore или quick resync, RFC7162 в обоих случаях. Это то, что использует Thunderbird.

Это пара команд поддержки расширений, таких как «дайте мне все UID, которые изменились с тех пор, как я последний раз подключился», «скажите мне, что было удалено» и так далее.

+1

Да, но он говорит, что он не поддерживается широко, и на нем не следует создавать целую структуру: http://stackoverflow.com/questions/23176247/is-imap-condstore-widely-supported Я думаю, что я должен хранить последний сохраненный uid и сравнить только это для новых писем. Или я должен использовать getNextUID()? Но на почтовом сервере это всегда -1. С другой стороны, предположим, что я храню 10.mail имеет uid 100, и я сохраняю это значение. На nexy fetch я могу получить почту, начиная с UID 100 и новее. Но почта с uid была удалена до того, как я выберу? Поддерживает ли imap поддержку uid больше, чем x (uids awlays incremental?) – benchpresser

+2

IMAP UID всегда увеличиваются, пока значение uidvalidity для почтового ящика остается неизменным. И это совершенно верно, это не широко поддерживается. Но если вы хотите сделать то, что хотите сделать, это наиболее широко распространенный способ (и на практике единственный способ). Различные серверы не поддерживают его, например mail.ru, что фактически означает, что если российские конечные пользователи составляют значительную часть вашего целевого рынка, то функция, которую вы хотите, практически не реализуема. – arnt

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