[size=x-small] 1 Folder is not open[/size]
最近要做一个邮件收取的东东,功能类似于QQ邮箱中的“其他邮箱”。于是考虑用javamail来实现,查了一些相关的资料,动手写了一个邮箱收取的程序,但是在运行时,在邮箱邮件比较多的情况下,大概每次在收取大概5分钟左右,就会报下面的异常:
java.lang.IllegalStateException: Folder is not Open
at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:422)
at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:193)
很是郁闷,屡试不爽,每次都会报,在网上google了半天,也没有找到相关的解决办法,最后自己摸索,终于把这个问题解决了。就是在每次读取一个folder时,先判断是否close,如果close就在重新打开一次,这样就解决了,详见下面的代码:
Message message[] = folder.getMessages();
System.out.println("收件箱总数: " + message.length);
for (int i = 0; i < message.length; i++) {
if(!message[i].getFolder().isOpen()) //判断是否open
message[i].getFolder().open(Folder.READ_WRITE) //如果close,就重新open
printMessage(message[i]);
}
注意上面的两行注释,每次for循环打开一个新的message时,先判断和这个message里面的folder是否是close的,如果close,就重新打开。后面的printmessage是自已封装的一个方法,对每封邮件进行处理的函数。 这样,就可以解决Folder is not open异常了。
2 OutOfMemory 异常
用上面的方法解决了folder is close的异常了,可是在收阅邮件中,如果含有大量的附件,并且在时间较长的情况下,又会报OutOfMemory 异常,很郁闷!遂google相关资料,知道原因是,每次读完一份邮件后,javamail会自动的把该邮件加到cache中,邮件量比较大,在含有大量附件,肯定会报内存溢出错误。但是解决办法没找到,不过其中有一篇文章提到了解决办法,就是修改javamail的源文件中的POP3Folder.java类,让每封邮件读完后,别自动的往缓存中添加,修改后,在重新编译成class,这样是可以解决,但是要改javamail原生的代码,总感觉不太好,应该还有更好的解决办法,不到万不得已,最好不要改原生代码,于是研读javamail APi,终于,在一个角落看到了一个方法POP3Message.invalidate(true); api如下:
invalidate
public void invalidate(boolean invalidateHeaders)Invalidate the cache of content for this message object, causing it to be fetched again from the server the next time it is needed. If invalidateHeaders is true, invalidate the headers as well.
Parameters:
invalidateHeaders - invalidate the headers as well?
啥意思,如果是true,就每次不往缓存中添加内容,false还会添加,默认为false的。这时候答案出来了,原来javamail的开发者早就考虑了这一点,呵呵,于是在程序中添加了这一句,在收取邮件时,上百封邮件,含有大量的附近,中途再没出现过异常。代码见下方:
Message message[] = folder.getMessages();
System.out.println("收件箱总数: " + message.length);
for (int i = 0; i < message.length; i++) {
if(!message[i].getFolder().isOpen())
message[i].getFolder().open(Folder.READ_WRITE);
printMessage(message[i]);
POP3Message)message[i]).invalidate(true); // 每封邮件读取完后,设置不往cache中添加
}
这样文件就解决了。。。。。
如有疑问或书写错误的,请跟帖!或QQ:231901209
分享到:
相关推荐
javamail中文API文档 方法解释详细。
javamail问题及解决方案源码
Fundamentals of the JavaMail API Presented by developerWorks, your source for great tutorials ibm.com/developerWorks Table of Contents If you're viewing this document online, you can click ...
NULL 博文链接:https://satikey.iteye.com/blog/824976
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。 虽然...
providers are not part of the standard JavaMail API. Portable programs will not use these APIs. Nonportable programs may use the APIs of the Sun protocol providers by (for example) casting a returned...
javamail附件从流中获取
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。 JavaMail...
javaMail javaMail javaMail javaMail javaMail javaMail javaMail
javamail的jar包:javamail-1.6; javamail的jar包:javamail-1.6
JAVAMAIL开发JAVAMAIL开发
Mail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。activation.jar 文件就是JAF的框架jar...
javamail开发,带图形界面,邮件的发送,接收,带附件,html,邮件解析
javamail.jar,javamail资源包
JavaMail JavaMail JavaMail JavaMail JavaMail JavaMail JavaMail
包含JavaMail1.4.5、JAF1.1.1、JavaMail API文档英文版,以及JavaMailAPI中文详解
开发的过程中,运行时可能会出现以下的错误: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream 原因是jar包版本不统一,解决方法如下: 删除Java EE 5 Libraries/...
javamail发送邮件实例 javamail 发送邮件 文本编辑器 kindeditor
解决javamail 用imap 主题(标题)过长 会出异常
JavaMail_API基本原理,JavaMail_API学习javaMail必备,