Java-Mail mit Anhang: ClassCastException auf javax.mail.Multipart

7

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%     
Karthick Ramu 04.01.2011, 13:38
quelle

6 Antworten

5

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%     
kahlk 24.01.2014 10:38
quelle
4

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

    
systempuntoout 04.01.2011 14:09
quelle
3

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.

    
Brendan 04.10.2012 21:34
quelle
3

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!

    
jagmohan 29.08.2013 12:15
quelle
2

Ja, weil Sie annehmen, dass getContent() etwas zurückgibt, das Multipart implementiert, und in diesem Fall nicht ( IMAPInputStream erweitert InputStream ).

Ihr Code muss diese Möglichkeit berücksichtigen.

    
skaffman 04.01.2011 13:52
quelle
2

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 ...

%Vor%

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.

    
Pace 04.01.2011 13:55
quelle

Tags und Links