Ah oui, désolé, j'avais pas vu cette méthode sortie de nulle part et pas décrite
C'est vrai que le tuto est un peu léger sur l'aspect général du fonctionnement et se cantonne à un aspect particulier
Ca va être un peu plus compliqué que ce qu'il a mis.
Tout d'abord, il va falloir distinguer si on un message simple, ou un message constitué de plusieurs éléments.
Un moyen simple de le faire est de faire :
1 2 3 4 5 6 7 8 9 10 11 12
| try {
Object content = message.getContent();
if (content instanceof Multipart) {
readMultipart((Multipart) content );
} else {
readPart(message);
}
} catch (MessagingException e) {
e.printStackTrace();
} |
avec :
1 2 3 4 5 6 7
| private void readMultipart(Multipart multipart)
throws MessagingException, IOException {
int n = multipart.getCount();
for (int i = 0; i < n; i++) {
readPart(multipart.getBodyPart(i));
}
} |
Pour
readPart(Part part), on va traiter chaque partie séparément, mais de la même façon
Tout d'abord, il faut déterminer ce qu'il y a dans une partie : du texte, du html, un attachement (pièce jointe en français)...
Pour faire ça il faut appeler les méthodes getDisposition() et getContentType() de la classe Message et tester la valeur retournée :
- si getDisposition() retourne null on est dans le cas du message
- si getDisposition() retourne Part.ATTACHMENT on est dans le cas d'un attachement
- si getDisposition() retourne Part.INLINE on est dans le cas d'un élément dans un texte (comme une image au milieu du texte du mail)
si
part.getDisposition()==null :
- si le content type est "text/plain", l'instance retournée par getContent() est une String et il s'agit d'un texte
- s'il s'agit de "text/plain; charset="<un nom de charset>", il s'agit d'un texte mais encodé dans un encodage particulier : je ne me souviens plus si getContent() te retourne la String bien décodée, ou s'il ne faut pas récupérer le stream par getInputStream et lire avec un charset (par exemple avec un InputStreamReader en parsant le charset pour le passer en argument)
- s'il s'agit de text/html, c'est pareil, sauf que la chaine récupérée contiendra du html
si
Part.ATTACHMENT.equals(part.getDisposition()) :
Il suffit de récupérer le
part.getInputStream() et le copier dans un
FileOutputStream(new File(dossierDeSauvegarde,part.getFileName()))avec la technique habituelle de copie de inputstream vers outputstream (enfin ça dépend de la façon de gérer : si tu ne fais qu'afficher le mail dans une JFrame par exemple, tu peux lire les images attachées directement par ImageIO.load(...) pour les afficher directement (ou tu affiches plutôt des icônes (en fonction du contenttype par exemple) et un bouton télécharger les pièces jointes)
si
Part.INLINE.equals(part.getDisposition()) c'est comme pour Part.ATTACHMENT, mais il y aura une référence à ce fichier dans un des textes
par exemple un <IMG> dans un html : il faudra éventuellement modifier le src dans ce cas pour qu'il pointe vers le path du fichier en fonction de l'endroit ou tu vas sauvegarde le fichier (ou sauvegarder le html exactement à l'endroit du fichier et utiliser un src relatif)
Partager