javax.mail 当索引确实存在时抛出 IndexOutOfBoundsException

javax.mail throws IndexOutOfBoundsException when index do exists

包使用:

com.sun.mail:javax.mail:1.5.6 来自 maven

我写了一个 scala 程序,我用 javax.mail 来处理电子邮件。在第一部分中,我通过 message.getMessageNumber 获得了一些邮件 ID,后来当我尝试通过这些 ID 检索邮件时发生了 IndexOutOfBoundsException。邮件服务器在此过程中没有任何变化。

这是我获取消息 ID 的代码。

val Final = new AndTerm(Subject,Size)
//val FinalTerm = new AndTerm(From)
val messages = inbox.search(Final).map{
  message=>
    val date = trim(message.getSubject)
    (date,message.getMessageNumber)
}.filter(_._1.isDefined).map(_._2)
inbox.close(true)
store.close

这是抛出异常的代码。

//newed another store and Folder with the same name
val ContentType = messages.map(id=>inbox.getMessage(id).getContentType())
inbox.close(true)
store.close

异常消息:

Exception in thread "main" java.lang.IndexOutOfBoundsException: 416 > 64
at com.sun.mail.imap.IMAPFolder.checkRange(IMAPFolder.java:513)
at com.sun.mail.imap.IMAPFolder.getMessage(IMAPFolder.java:1770)
at EmailReader.MessageByNumber(EmailReader.scala:67)
at Main$$anonfun$main.apply(Main.scala:43)
at Main$$anonfun$main.apply(Main.scala:41)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at Main$.main(Main.scala:40)
at Main.main(Main.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

416 > 64 提示我可能存在一些服务器端限制,是真的吗?

我认为这些数字表示您传递的 ID 为 416,而集合的计数为 64。看来 getMessage(id) 可能正在尝试寻找一个数字以从数组中检索该消息;例如 getMessage(0) 将是集合中的第一个。相反,代码似乎正在传递不能直接转换为集合中数字的消息 ID。

您似乎在获取 Message 对象后关闭了 Folder。消息编号(和消息对象)仅在文件夹打开时有效。