JavaMail:获取MimeMessage的大小

时间:2011-05-23 09:15:52

标签: java javamail

我正在尝试获取MimeMessage的大小。 getSize()方法总是返回-1。

这是我的代码:

MimeMessage m = new MimeMessage(session);
m.setFrom(new InternetAddress(fromAddress, true));
m.setRecipient(RecipientType.TO, new InternetAddress(toAddress, true));
m.setSubject(subject);

MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(body, "text/html");
Multipart mp = new MimeMultipart();
mp.addBodyPart(bodyPart);
m.setContent(mp);

m.getSize(); // -1 is returned

这是对我的问题的回答:

ByteArrayOutputStream os = new ByteArrayOutputStream();
m.writeTo(os);
int bytes = os.size();

3 个答案:

答案 0 :(得分:1)

尝试调用mp.getSize()来查看它返回的内容,MIMEMessage仅在mp上调用它。 也来自MIME消息API

  

返回内容的大小   这部分以字节为单位。如果是,则返回-1   大小无法确定。

截至目前,您还没有将任何内容传递给消息,这可能是-1返回值的原因。

答案 1 :(得分:1)

Apache Commons 提供的解决方案很好,但现在不推荐使用 NullOutputStream() 构造函数。改用单例:

CountingOutputStream out = new CountingOutputStream(NullOutputStream.NULL_OUTPUT_STREAM);

答案 2 :(得分:0)

更有效的解决方案,但需要外部库,如下所示:

public static long getReliableSize(MimeMessage m) throws IOException, MessagingException {
    try (CountingOutputStream out = new CountingOutputStream(new NullOutputStream())) {
        m.writeTo(out);
        return out.getByteCount();
    }
}

CountingOutputStream和NullOutputStream都可在Apache Common IO中使用。该解决方案不需要使用临时字节缓冲区(写入,分配,重新分配等)