用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里面擦除了
分享到:
相关推荐
基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...
收邮件时,会通过`Store`对象连接到邮件服务器,获取`Folder`并读取其中的`Message`。 其次,系统具备了黑名单和白名单功能。这些功能通常会与用户账户设置关联,允许用户自定义过滤规则。黑名单中的地址发送的邮件...
连接成功后,可以打开邮箱并获取邮件列表: ```java Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); Message[] messages = inbox.getMessages(); for (Message message : messages) { /...
使用 JavaMail 代发邮件 使用 JavaMail 库可以轻松地在 Java 应用程序中发送电子邮件。JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件...
- **JavaMail API**:JavaMail API是一个用于读取、编写和发送电子邮件的可选包(标准扩展)。它可以用来构建基于标准的电子邮件客户端,并且支持多种互联网邮件协议,如SMTP(用于发送邮件)、POP(用于接收邮件)...
JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...
项目中要求读取指定邮件未读邮件的内容,在网上查了很多资料发现都不行,不是自己想要的,要么是读取最新的,要么是读取第一封邮件,根本就不能读取未读的旧邮件。...java读取未读邮件内容包括附件包含javamail.jar
在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...
- 读取邮件内容:通过 `MimeMessage.getContent()` 获取邮件内容,如文本、HTML、附件等。 - 关闭连接:完成操作后,记得关闭 Store 和 Folder,以释放资源。 除了 JavaMail API,还可以使用 Jakarta Commons ...
1. **Javamail API**:Javamail API 提供了多种类和接口,如`Session`、`Message`、`Address`等,用于创建、发送和读取邮件。开发者可以通过`Session`实例配置SMTP服务器信息,通过`Message`对象创建邮件内容,而`...
3. **读取邮件**:使用`Folder`对象打开邮箱,并通过`Folder.getMessages()`获取邮件列表。对于每封邮件,可以使用`Message`对象获取其详细信息,包括发件人、主题、日期和内容。 4. **处理邮件内容**:对于包含...
JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...
《基于Javamail的邮件收发系统》项目是一份全面的资料集合,包含了系统实现、相关文档、开题报告、任务书、外文翻译、文献综述以及答辩PPT等重要组成部分,旨在帮助读者深入理解和掌握使用JavaMail进行邮件收发的...
JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个功能通常涉及到SMTP(简单邮件传输协议)和其他相关的互联网邮件协议。在JavaMail中,`mail.jar` 和 `activation.jar` 是两个关键的库...
JavaMail 是一个强大的开源库,专门用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理SMTP、POP3和IMAP等邮件协议。在JavaMail中,我们可以实现各种复杂的邮件功能,如添加附件...
JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送与接收。在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 ...
(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