JavaMail-为什么我在文件夹操作中会偶尔收到StoreClosedException异常?

4
我有以下代码片段:
// using classes from javax.mail.*
// Session / Store setup code
// Store implementation class = com.sun.mail.imap.IMAPStore

Folder folder = store.getFolder("INBOX");  // store setup previously
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
Folder anotherFolder = store.getFolder("F1");
if ( !anotherFolder.exists()) {                   [***]
  anotherFolder.create(Folder.HOLDS_MESSAGES);
}
folder.copyMessages(messages, anotherFolder);

偶尔,我会遇到以下异常:

javax.mail.StoreClosedException: failed to create new store connection
   at com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:2208)
   at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:2335)
   at com.sun.mail.imap.IMAPFolder.exists(IMAPFolder.java:427)
   at [***]

我不确定这是我错误使用JavaMail API的结果,还是服务器问题。我有两个观察结果:
  1. 检查文件夹存在性时出现故障,而不是调用getFolder时。
  2. 在代码中多次调用getFolder。
我想这可能是由于与邮件服务器的连接在folder.getMessages()之后的某个时间点断开,但它总是在exist()调用失败,而不是create()调用失败。
一种解决方法是先调用store.isConnected()并在需要时重新连接,但我想首先弄清楚是否有什么地方做错了,然后再采取这种方法。
我将非常感谢任何关于如何深入探究此异常来源的见解或建议。提前感谢!
2个回答

4
问题在于你没有关闭文件夹。使用完后,我们必须关闭文件夹。需要时再次打开文件夹,不要多次打开同一个文件夹。
folder.close(false);
.
.
.
.
.
.
if (!folder.isOpen()) {
    folder.open(Folder.READ_ONLY);
}

1
我追踪到了服务器本身。我使用递归方法连接Dovecot以复制整个文件夹结构。(基本上,我正在从其2008年未维护版本的ImapCopy中进行分叉,该版本依赖于旧的Log4J和JGoodies,以使用本机Swing / Netbeans表单和更新的Log4j,并支持不允许混合文件夹和消息的服务器)
这是dovecot本身:2016-06-04T01:48: 34.538050-04:00 moz dovecot:imap-login:用户+ IP的最大连接数超过了(mail_max_userip_connections=10):user=,method=PLAIN,rip=10.1.4.21,lip=10.1.4.235,TLS,session=<6MXUY200UQAKrgQV>
所以现在我必须更新该字段以允许超过10个连接。或者,更正确地说,因为我计划在o365上使用它,先递归读取文件夹结构(而不打开新连接或关闭旧连接),然后单独循环遍历文件夹结构以处理消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接