[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问题及解决方案 JavaMail是Java平台中用于发送和接收邮件的API,它提供了对各种邮件协议的支持,如SMTP、POP3和IMAP。然而,在实际应用中,JavaMail经常会遇到各种问题,比如连接失败、身份验证错误等...
JavaMail API是Java平台上的电子邮件解决方案,它提供了一组用于发送、接收、管理和处理电子邮件消息的API。JavaMail API主要包含以下几个核心概念:会话(Session)、消息(Message)、地址(Address)、验证程序...
- `open()` 方法:打开 Folder 时,可能会一次性加载所有邮件,如果没有限制,会导致内存压力增大。 - `getMessage(int msgnum)` 方法:获取指定编号的邮件,如果频繁调用且未处理好邮件对象,可能导致内存累积。 - ...
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 ...
JavaMail 是一个强大的开源库,用于在Java应用程序中实现电子邮件的发送和接收功能。它提供了丰富的API,使得开发者能够方便地处理SMTP、POP3、IMAP等邮件协议,支持多种邮件格式,包括文本、HTML以及带有附件的邮件...
JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...
JavaMail是一种开源的Java库,它允许开发人员在Java应用程序中发送和接收电子邮件。IMAP(Internet Message Access Protocol)是一种标准的邮件访问协议,用于从邮件服务器检索邮件。Exchange 2007是微软的企业级...
开发者可以使用 `Folder.open()` 方法打开文件夹,然后读取、删除或移动邮件。 8. **Authentication**:JavaMail 支持各种认证机制,如 PLAIN、LOGIN、CRAM-MD5 和 DIGEST-MD5 等,以确保安全地连接到邮件服务器。 ...
9. **Folder的遍历和搜索**:JavaMail提供了遍历和搜索邮件的功能,可以通过`Folder.search(SearchTerm term)`方法根据特定条件查找邮件。 10. **POP3和IMAP支持**:JavaMail API不仅支持SMTP(发送邮件),还支持...
NULL 博文链接:https://satikey.iteye.com/blog/824976
`Folder`类提供了`open()`方法来打开邮箱,`getMessage()`方法获取单个邮件,`getMessages()`方法获取所有邮件,以及`addMessage()`方法添加新邮件到邮箱。 在使用JavaMail API时,你需要在项目中引入`mail.jar`。...
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。 虽然...
我们可以通过`Folder`的`open`方法打开指定的文件夹,然后调用`Folder.getMessage`或`Folder.getMessages`获取邮件。`Message`对象可以被用来获取邮件的所有信息,如发件人、收件人、主题、正文和附件。 JavaMail还...
开发者可以通过`Store.connect()`方法连接到邮件服务器,然后使用`Folder`的`open()`方法打开特定的邮箱文件夹。 5. **Transport类**: `Transport`负责发送邮件,通过调用`Transport.send()`方法将`Message`对象...
使用`Store`类的`connect()`方法,然后通过`Folder`对象的`open()`方法打开邮箱。`Folder`中的`getMessages()`方法可以获取邮件列表,每条`Message`都可以通过`getContent()`或`getParts()`来读取其内容。 8. **...
JavaMail API是Java EE的一部分,但也可以在Java SE环境中使用。`javaMail.jar`是JavaMail API的实现库,包含了实现邮件协议(如SMTP、POP3、IMAP)的类和方法。 JavaMail API的核心概念包括以下几个部分: 1. **...
你可以通过Folder.open()方法打开文件夹,然后使用Folder.getMessage()获取邮件内容。 8. **POP3和IMAP协议**:JavaMail支持这两种主要的邮件接收协议。POP3(Post Office Protocol version 3)主要用于下载邮件,...
在实际应用中,开发者通常会结合 JavaMail API 与 JavaEE 中的 JavaMail Session 组件,或者 Spring Framework 中的 JavaMailSender 接口来集成邮件发送功能。JavaMail 1.4.7 版本虽然较旧,但依然广泛使用,因为其...
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...
inbox.open(Folder.READ_ONLY); Message[] messages = inbox.getMessages(); for (Message msg : messages) { // 处理每封邮件 } ``` 通过这些示例,你可以了解到JavaMail库的基本用法,并能根据实际需求进行扩展...