1

java 邮件 API 使用流式传输吗?我在哪里可以得到源代码来确认这一点。我也尝试使用原始和非原始模式发送邮件。在原始模式下,我可以将输入流传递给 MimeMessage 构造函数:[/b]

new MimeMessage(session, doc.getBodyInputStream());

在非原始模式下,我必须执行以下操作因为可以有任何 mime 类型,所以我必须使用DataHandlerand DataSource。由于DataSource接口合同规定每次调用时都提供新的 inputStream getInputStream(),因此我们需要将数据保留在byte[]其中会为大尺寸或文档抛出 OOM 有没有办法避免这种情况?

MimeMessage msg = new MimeMessage(session);
byte[] bArr = doc.getBody();
ByteArrayInputStream ins = new ByteArrayInputStream(
    bArr != null && bArr.length > 0 ?  bArr : "".getBytes());
msg.setDataHandler(new DataHandler( new ByteArrayDataSource(ins, mimeType)));
4

3 回答 3

1

如果您只处理一封邮件,或者您在处理(和缓存!)几封邮件后得到 OOM,是否会出现问题?

增加堆大小是一种选择,但如果它只是增加了下一次 OOM 对您造成伤害的时间,那么您可以考虑将原始字节数组保存在内存中的替代方法。

并且您应该使用ByteArrayDataSource(byte[] bArr, String type)构造函数,这可以防止在内存中复制完整的字节数组,因为bArr它只是按原样存储在 DataSource 中。另一个构造函数以 8k 字节数组开头,每次需要更多空间时都会将其大小加倍 - 这会浪费大量内存,并且可能是您的问题的原因。(来源

于 2009-12-22T10:50:33.960 回答
0

关于 OOM,通常您的邮件不应大于 10MB,而字节数组中的大小不应超过 10MB。

这是一个理论问题吗?或者你真的看到这种情况发生?

如果你看到它发生,那么增加你的堆大小,因为上面的代码看起来或多或少是正确的。

于 2009-12-22T10:13:20.087 回答
0

是否可以将正文转储到(临时)文件,让转储的 bArr 超出范围(或设置为 null),然后使用 FileDataSource?

于 2009-12-22T10:36:01.820 回答