11 votes

JavaMail : obtention de la taille d'un MimeMessage

J'essaie d'obtenir la taille d'un MimeMessage. La méthode getSize() renvoie simplement toujours -1.

Voici mon code :

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

VOICI LA RÉPONSE À MA QUESTION :

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

2voto

Luc Claes Points 21

Une solution plus efficace, mais nécessitant une bibliothèque externe, est la suivante :

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

CountingOutputStream et NullOutputStream sont tous deux disponibles dans Apache Common IO. Cette solution ne nécessite pas de travailler avec un tampon d'octets temporaire (écriture, allocation, réallocation, etc.).

1voto

sudmong Points 1748

Essayez d'appeler mp.getSize() pour voir ce qu'il retourne, MIMEMessage l'appelle sur mp seulement. Aussi de l'API MIME message

Retourne la taille du contenu de cette partie en octets. Retourne -1 si la taille ne peut être déterminée.

Pour l'instant, vous n'avez pas passé de contenu au message, ce qui pourrait être la raison de la valeur de retour de -1.

1voto

gener Points 21

La solution fournie avec Apache Commons est bonne, mais le constructeur NullOutputStream() est maintenant déprécié. Utilisez le singleton à la place :

CountingOutputStream out = new CountingOutputStream(NullOutputStream.NULL_OUTPUT_STREAM);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X