我正在阅读来自emailServer的电子邮件并将其保存在数据库中。我正在使用以下代码从电子邮件服务器上的文件夹(“INBOX”)中读取邮件并检索与其对应的邮件但我正在
"java.lang.ArrayIndexOutOfBoundsException: message number (621) out of bounds (620)
at com.sun.mail.imap.MessageCache.getMessage(MessageCache.java:123)
at com.sun.mail.imap.MessageCache.getMessageBySeqnum(MessageCache.java:153)
at com.sun.mail.imap.IMAPFolder.getMessageBySeqNumber(IMAPFolder.java:2795)
at com.sun.mail.imap.IMAPFolder.getMessagesByUID(IMAPFolder.java:1924)"
我正在使用javax.mail.1.4.4,这个问题主要是在收件箱被淹没时出现的。
使用的代码:
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
// messageUID is uid of last message I saved in DB
Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID);
我做了一些研究,发现一旦打开就为文件夹设置了messagecache,我们假设它被设置为520(文件夹的大小)。如果在设置了消息缓存后到达任何消息,那么在最后一条消息序列中,num超过了消息缓存的总大小,并引发异常。
任何人都可以告诉我如何获取文件夹中Last消息的UId的绝对值,或者如何获取文件夹锁定,以便在设置缓存后,文件夹不会更新文件夹的大小。
答案 0 :(得分:6)
有趣的问题!
首先,我认为这是javax邮件中的一个错误。可能应该在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);
答案 1 :(得分:0)
这可能就是这个Javamail的错误:
https://java.net/projects/javamail/lists/issues/archive/2010-09/message/1