Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaMail:获取mimessage的大小_Java_Jakarta Mail - Fatal编程技术网

JavaMail:获取mimessage的大小

JavaMail:获取mimessage的大小,java,jakarta-mail,Java,Jakarta Mail,我在试着得到一封短信的大小。 方法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 body

我在试着得到一封短信的大小。 方法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();
尝试调用mp.getSize()以查看它返回的内容,MIMEMessage仅在mp上调用它。 同样来自MIME消息API

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


到目前为止,您尚未向消息传递任何内容,这可能是-1返回值的原因。

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

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公共IO中都可用。该解决方案不需要使用临时字节缓冲区(写入、分配、重新分配等)。

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

CountingOutputStream out=新的CountingOutputStream(NullOutputStream.NULL\u OUTPUT\u STREAM);

我没有传递任何内容是什么意思?我执行了m.setContent(mp)bodyPart.getSize()返回-1将一些内容添加到正文中。。如果有人还在看这个,MimeMessage和mimembodypart会在内容对象或内容流上运行getSize()。这些是由构造函数设置的,但不是由setContent()设置的,因此即使getContent()返回数据,getSize()也会错误地返回-1。使用调试器跟踪内部数据,因为它可以存储在datahandler下的多个位置。例如,可以通过在datahandler的数据源的输入流上调用available()来测量附件。