JavaMail: получить размер MimeMessage - PullRequest
8 голосов
/ 23 мая 2011

Я пытаюсь получить размер 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();

Ответы [ 2 ]

1 голос
/ 23 мая 2011

попробуйте вызвать mp.getSize (), чтобы увидеть, что он возвращает, MIMEMessage вызывает его только в mp. Также из сообщения API MIME

Возвращает размер содержимого эта часть в байтах. Вернуть -1, если размер не может быть определен.

На данный момент вы не передали в сообщение никакого содержимого, что может быть причиной возврата -1.

0 голосов
/ 17 января 2018

Более эффективное решение, но требующее внешней библиотеки, следующее:

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. Это решение не требует работы с временным байтовым буфером (запись, выделение, перераспределение и т. Д.)

...