Comment gérer le courrier multipart / alternatif avec JavaMail?

J'ai écrit une application qui récupère tous les e-mails à partir d'une boîte de réception, filtre les e-mails qui contiennent une chaîne de caractères, puis place les e-mails dans une ArrayList.

Après les e-mails sont mis dans la Liste, je suis en train de faire quelque chose avec l'objet et le contenu de ces e-mails. Cela fonctionne tout beau pour les e-mails sans pièce jointe. Mais quand j'ai commencé à utiliser des e-mails avec des pièces jointes de tout cela n'a pas fonctionné comme prévu plus.

C'est mon code:

public void getInhoud(Message msg) throws IOException {
    try {
        cont = msg.getContent();
    } catch (MessagingException ex) {
        Logger.getLogger(ReadMailNew.class.getName()).log(Level.SEVERE, null, ex);
    }
    if (cont instanceof String) {
        String body = (String) cont;


    } else if (cont instanceof Multipart) {
        try {
            Multipart mp = (Multipart) msg.getContent();
            int mp_count = mp.getCount();
            for (int b = 0; b < 1; b++) {
                    dumpPart(mp.getBodyPart(b));
            }
        } catch (Exception ex) {
            System.out.println("Exception arise at get Content");
            ex.printStackTrace();
        }
    }
}

public void dumpPart(Part p) throws Exception {
    email = null;
    String contentType = p.getContentType();
    System.out.println("dumpPart" + contentType);
    InputStream is = p.getInputStream();
    if (!(is instanceof BufferedInputStream)) {
        is = new BufferedInputStream(is);
    }
    int c;
    final StringWriter sw = new StringWriter();
    while ((c = is.read()) != -1) {
        sw.write(c);
    }

    if (!sw.toString().contains("<div>")) {
        mpMessage = sw.toString();
        getReferentie(mpMessage);
    }
}

Le contenu de l'e-mail est stocké dans une Chaîne.

Ce code fonctionne tout va bien lorsque je tente de lire des e-mails sans pièce jointe. Mais si j'utilise un e-mail avec pièce jointe la Chaîne contient également le code HTML et même de l'adhésion de codage. Finalement je veux stocker la pièce jointe et le contenu d'un e-mail, mais ma première priorité est d'obtenir simplement le texte ou d'une pièce jointe HTML de codage.

Maintenant, j'ai essayé une approche différente pour gérer les différentes parties:

public void getInhoud(Message msg) throws IOException {
try {
Object contt = msg.getContent();
if (contt instanceof Multipart) {
System.out.println("Met attachment");
handleMultipart((Multipart) contt);
} else {
handlePart(msg);
System.out.println("Zonder attachment");
}
} catch (MessagingException ex) {
ex.printStackTrace();
}
}
public static void handleMultipart(Multipart multipart)
throws MessagingException, IOException {
for (int i = 0, n = multipart.getCount(); i < n; i++) {
handlePart(multipart.getBodyPart(i));
System.out.println("Count "+n);
}
}
public static void handlePart(Part part)
throws MessagingException, IOException {
String disposition = part.getDisposition();
String contentType = part.getContentType();
if (disposition == null) { //When just body
System.out.println("Null: " + contentType);
//Check if plain
if ((contentType.length() >= 10)
&& (contentType.toLowerCase().substring(
0, 10).equals("text/plain"))) {
part.writeTo(System.out);
} else if ((contentType.length() >= 9)
&& (contentType.toLowerCase().substring(
0, 9).equals("text/html"))) {
part.writeTo(System.out);
} else if ((contentType.length() >= 9)
&& (contentType.toLowerCase().substring(
0, 9).equals("text/html"))) {
System.out.println("Ook html gevonden");
part.writeTo(System.out);
}else{
System.out.println("Other body: " + contentType);
part.writeTo(System.out);
}
} else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
System.out.println("Attachment: " + part.getFileName()
+ " : " + contentType);
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
System.out.println("Inline: "
+ part.getFileName()
+ " : " + contentType);
} else {
System.out.println("Other: " + disposition);
}
}

C'est ce qui est retourné à partir de la System.out.printlns

Null: multipart/alternative; boundary=047d7b6220720b499504ce3786d7
Other body: multipart/alternative; boundary=047d7b6220720b499504ce3786d7
Content-Type: multipart/alternative; boundary="047d7b6220720b499504ce3786d7"
--047d7b6220720b499504ce3786d7
Content-Type: text/plain; charset="ISO-8859-1"
'Text of the message here in normal text'
--047d7b6220720b499504ce3786d7
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
'HTML code of the message'

Cette approche renvoie à la normale de texte de l'e-mail mais aussi le codage HTML de l'e-mail. Je ne comprends vraiment pas pourquoi cela se passe, j'ai googlé, mais il semble comme il n'y a personne d'autre avec ce problème.

Toute aide est appréciée,

Merci!

source d'informationauteur Jef