`

Javamail读取邮件列表出现OutOfMemery

阅读更多

用Javamail解析多个邮件的时候,如果个别邮件的附件过大,就会造成OutOfMemery的情况,如下

 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2786)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:71)
	at com.sun.mail.pop3.Protocol.multilineCommand(Protocol.java:362)
	at com.sun.mail.pop3.Protocol.retr(Protocol.java:237)
	at com.sun.mail.pop3.POP3Message.getContentStream(POP3Message.java:115)
	at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:60)
	at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:259)
	at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:159)
	at com.gdcn.mail.util.Pop3Util.hasAttachment(Pop3Util.java:1148)
	at com.gdcn.mail.util.Pop3Util.analysisMessage(Pop3Util.java:774)
	at com.gdcn.mail.util.Pop3Util.getMessages(Pop3Util.java:561)
	at com.gdcn.mail.util.Pop3Util.main(Pop3Util.java:1338)
 

原因是JavaMail会将这些Messages读入内存,由于这些邮件包含了附件等等,所以会造成这样的结果。

 

网上很多都说增加JVM或者Tomcat等的内存,但是这样仍然不能达到预期的效果。或来查阅了相关的文档和网上的结果,发现了解决这个问题的方法,我们只需要在解析完邮件之后增加这句

 

((POP3Message) message).invalidate(true);

 

sun有这样的解析

http://java.sun.com/products/javamail/javadocs/com/sun/mail/pop3/POP3Message.html

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?

 

这样就很好地将原来读取的message从cache里面擦除了

分享到:
评论
4 楼 Ben.Sin 2011-10-01  
liupeng_10408 写道
博主,你好!我开发的是android版邮件系统。
只写了如下几句,就报错了:
Multipart mp = (Multipart) msg.getContent();
int count = mp.getCount(); //这行报错:outofmemoryerror

你说的那句难道要写在报错这句的前面吗?



android的情况我不知道,或者确实需要更大的内存,因为原来的我在PC上开发。
邮件解析的时候通常要下载整个邮件,有的时候附件太大了就会很慢或者很可能引起outofmemer. 所以当我们轮询邮件的时候要执行释放
((POP3Message) messagei).invalidate(true); 
内部如何实现我并没有太深入研究,这个项目也成了历史了
3 楼 liupeng_10408 2011-09-24  
博主,你好!我开发的是android版邮件系统。
只写了如下几句,就报错了:
Multipart mp = (Multipart) msg.getContent();
int count = mp.getCount(); //这行报错:outofmemoryerror

你说的那句难道要写在报错这句的前面吗?
2 楼 Ben.Sin 2010-03-04  
ccxw1983 写道
我添了这句代码,还是报错,代码片段如下:
messages = inbox.getMessages(i);
inbox.fetch(messages, profile);
messagei = messages[0];
((POP3Message) messagei).invalidate(true); 
不知你是如何设置的,请赐教!
我的附件有32.7M。



不好意思,一直在忙,没时间来打理,不知道你找到答案了没有?

我是采用Folder.open()的方式访问的,大致意思如下

Session session = this.getSession(pop3Server, mailAddress, password, port);

Store store = this.getStore(session, protocol);
// Connect to mail server
store.connect();
Folder folder = store.getFolder("INBOX");
if (folder.exists()) {
   folder.open(Folder.READ_ONLY);
   messages = folder.getMessages(messageIds);

   for (Message message : messages) {
      // 解析邮件部分省略。。。

      // 释放邮件
      ((POP3Message) message).invalidate(true);
   }
}



1 楼 ccxw1983 2009-12-31  
我添了这句代码,还是报错,代码片段如下:
messages = inbox.getMessages(i);
inbox.fetch(messages, profile);
messagei = messages[0];
((POP3Message) messagei).invalidate(true); 
不知你是如何设置的,请赐教!
我的附件有32.7M。

相关推荐

    基于Javamail的邮件收发系统.zip

    基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...

    JavaMail 具备垃圾邮件过滤功能的邮箱

    收邮件时,会通过`Store`对象连接到邮件服务器,获取`Folder`并读取其中的`Message`。 其次,系统具备了黑名单和白名单功能。这些功能通常会与用户账户设置关联,允许用户自定义过滤规则。黑名单中的地址发送的邮件...

    javamail收取邮件(包括附件)

    连接成功后,可以打开邮箱并获取邮件列表: ```java Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); Message[] messages = inbox.getMessages(); for (Message message : messages) { /...

    使用JAVAMail代发邮件

    使用 JavaMail 代发邮件 使用 JavaMail 库可以轻松地在 Java 应用程序中发送电子邮件。JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件...

    James+Javamail构建邮件服务

    - **JavaMail API**:JavaMail API是一个用于读取、编写和发送电子邮件的可选包(标准扩展)。它可以用来构建基于标准的电子邮件客户端,并且支持多种互联网邮件协议,如SMTP(用于发送邮件)、POP(用于接收邮件)...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    java获取读取未读邮件旧未读邮件最新邮件删除邮件指定读取指定邮件下载附件内容包括附件包含javamailjar

    项目中要求读取指定邮件未读邮件的内容,在网上查了很多资料发现都不行,不是自己想要的,要么是读取最新的,要么是读取第一封邮件,根本就不能读取未读的旧邮件。...java读取未读邮件内容包括附件包含javamail.jar

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    javamail 回执邮件资料

    - 读取邮件内容:通过 `MimeMessage.getContent()` 获取邮件内容,如文本、HTML、附件等。 - 关闭连接:完成操作后,记得关闭 Store 和 Folder,以释放资源。 除了 JavaMail API,还可以使用 Jakarta Commons ...

    基于Javamail的邮件收发系统

    1. **Javamail API**:Javamail API 提供了多种类和接口,如`Session`、`Message`、`Address`等,用于创建、发送和读取邮件。开发者可以通过`Session`实例配置SMTP服务器信息,通过`Message`对象创建邮件内容,而`...

    james和javamail实现邮件收发(带发送附件)

    3. **读取邮件**:使用`Folder`对象打开邮箱,并通过`Folder.getMessages()`获取邮件列表。对于每封邮件,可以使用`Message`对象获取其详细信息,包括发件人、主题、日期和内容。 4. **处理邮件内容**:对于包含...

    javamail收发邮件加密和不加密

    JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...

    基于Javamail的邮件收发系统(系统+文档+开题报告+任务书+外文翻译+文献综述+答辩PPT).zip

    《基于Javamail的邮件收发系统》项目是一份全面的资料集合,包含了系统实现、相关文档、开题报告、任务书、外文翻译、文献综述以及答辩PPT等重要组成部分,旨在帮助读者深入理解和掌握使用JavaMail进行邮件收发的...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    用javaMail发送邮件

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个功能通常涉及到SMTP(简单邮件传输协议)和其他相关的互联网邮件协议。在JavaMail中,`mail.jar` 和 `activation.jar` 是两个关键的库...

    javaMail 发邮件

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...

    怎么用JavaMail收取邮件

    JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送与接收。在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 ...

    (Java毕业设计)基于Javamail的邮件收发系统(系统++开题报告+任务书+外文翻译+文献综述+答辩PPT).rar

    (Java毕业设计)基于Javamail的邮件收发系统(Java毕业设计)基于Javamail的邮件收发系统(Java毕业设计)基于Javamail的邮件收发系统(Java毕业设计)基于Javamail的邮件收发系统(Java毕业设计)基于Javamail的邮件收发系统...

    JavaMail邮件收发实例_JavaMail_API

    JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API

Global site tag (gtag.js) - Google Analytics