Ich verwende den folgenden Code, um den Anhang aus der Mail herunterzuladen, aber es gibt ClassCastException
in der Multipart-Deklaration:
Ausnahme im Thread "main" java.lang.ClassCastException: com.sun.mail.imap.IMAPInputStream kann nicht in javax.mail.Multipart umgewandelt werden bei ReadAttachment.main (ReadAttachment.java:52)
Wie gehe ich mit IMAPInputStream um?
%Vor%Ich hatte das gleiche Problem mit JavaMail 1.5.1 und OSGi. Die Verwendung von msg.getContent () gab immer einen InputStream zurück, wenn er von einem OSGi-Paket aufgerufen wurde, während er beim Aufruf aus einem einfachen Java-Testprogramm einwandfrei funktioniert.
Das Festlegen der Standard-CommandMap funktionierte bei mir nicht, aber ich habe hier eine Lösung gefunden:
%Vor%Die Methode getContent gibt den Inhalt als zurück ein Java-Objekt und dessen Typ ist natürlich abhängig vom Inhalt selbst.
Das zurückgegebene Objekt für "text / plain" Inhalt ist normalerweise ein String-Objekt.
Das Objekt wurde für einen "Multipart" zurückgegeben Inhalt ist immer ein Multipart Unterklasse.
Für Inhaltstypen, die das sind unbekannt für das DataHandler-System, ein Eingabestrom wird als zurückgegeben Inhalt.
Auf dem Java Apache Cocoon quellcode < sup> * :
%Vor%* Ich übernehme keine Verantwortung für den möglichen Missbrauch von instanceof
OK. Ich denke, das wirkliche Problem hier ist, dass, obwohl Sie nach dem Objekttyp suchen sollten, den Sie zurückbekommen .... es könnte immer noch IMAPInputStream sein, wenn es nicht sein sollte.
Ich hämmere seit über zwei Tagen darauf.
Das zugrunde liegende Problem ist oft, dass das Java Mail API etwas sehr dummes tut, es versucht, eine Datei namens mailcap einzulesen, die nicht immer verfügbar ist, wenn der Klassenlader umgeschaltet wurde. Dies ist in meinem Fall besonders schwierig, da ich mit OSGi-Bundles zu tun habe und keine direkte Kontrolle darüber zu haben scheint, welchen Loader ich benutze .... aber ich schweife ab.
Ich fand "eine Lösung" ... vielleicht THE FIX, nachdem ich als letzten Ausweg den Quellcode der Java Mail API gesichtet hatte.
%Vor%Ich habe seit Tagen gegoogelt und Dutzende von Leuten mit dem gleichen Problem und verschiedenen Classpath-, Thread- und Classloader-Vorschlägen gefunden. Aber das ist das einzige, was für mich funktioniert hat und es ist relativ einfach. Daher postete dies etwas, das mit einem gewissen Momentum am nächsten zu sein scheint. PHEW.
Ich habe diesen Fehler behoben, indem ich die folgenden Codezeilen hinzugefügt habe. Da etwas mit MailCap nicht stimmt, kann javamail keinen Handler für den multipart / mixed Teil finden, daher muss dieses Bit hinzugefügt werden. Das hat mein Problem gelöst. Hoffe es hilft jemandem da draußen.
%Vor%Prost!
Das von getContent
zurückgegebene Objekt hängt vom Nachrichtentyp ab. Es wird nur Multipart sein, wenn der Nachrichtentyp multipart ist. Du könntest eine if-Prüfung machen, um den MIME-Typ anzuschauen ...
Das beinhaltet natürlich die Verwendung von magischen Saiten. Eine ausgefeiltere Lösung wäre, in die DataHandler-API zu schauen und die Methode getDataHandler()
für die Nachricht zu verwenden. Leider weiß ich nicht viel über diese API.