Ответ 1
Интересная проблема!
Во-первых, я думаю, что это ошибка в javax mail. Вероятно, должен быть вызов checkRange() в getMessageBySeqNumber() или просто Math.min() с размером вектора.
В любом случае проблема заключается в том, что код отправляется на сервер для получения последнего количества сообщений, но никогда не обновляет локальный MessageCache. Это означает, что messageCache имеет устаревшие данные по сравнению с методом, но метод по-прежнему предполагает, что он обновлен... как вы видели, радость обеспечивает.
Теперь, как избежать этого, пока он не будет исправлен?
К сожалению, я думаю, что вы застряли в довольно ужасном обходном пути, делая что-то вроде:
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
// messageUID is uid of last message I saved in DB
/* I apologize for all of the kittens that this code is about to kill */
boolean getMessagesWorked = false;
do {
try {
Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID);
getMessagesWorked = true;
} catch (ArrayIndexOutOfBoundsException e) {
/* Doing this should force the internal messagesCache to get updated
* Unfortunately, this is also somewhat racy, depending on just how
* hard the mail folder is being hit */
try {
folder.getMessage(folder.getMessageCount());
} catch (ArrayIndexOutOfBoundsException e) {
/* There really isn't much you can do here, except try again.
* the good news is that this should hardly ever happen!!
* Good in this case is a relative term! */
}
}
} while (! getMessagesWorked);