| 

.NET C# Java Javascript Exception

2
Hallo,

mein Mailabruf klappt geundsätzlich. Jetzt habe ich den Testaccount gewechselt (GMX zu Gmail) und ich erhalte folgende Fehlermeldung:

java.lang.ClassCastException: java.lang.String cannot be cast to javax.mail.Multipart

Mein Code sieht so aus (bearbeiteter Java-Insel-Code):
public class Mailempfang
{
private static String mail = "test mailempfang()";
//
//
public static String mailempfang(String host, String user, String passwd, String protokoll)
throws Exception
{
Session session = Session.getDefaultInstance( new Properties() );
Store store = session.getStore( protokoll );
store.connect( host, user, passwd );
Folder folder = store.getFolder( "INBOX" );
folder.open( Folder.READ_ONLY );
Message[] message = folder.getMessages();
// TODO: dezeit auf max. 5 Nachrichten beschränkt
int length = message.length;
if (length > 5) { length = 5; }
for ( int i = 0; i < length; i++ )//5; i++)//
{
Message m = message[ i ];
mail += "Nachricht: " + i + "\n";
mail += "From: " + m.getFrom()[0] + "\n";
mail += "Subject: " + m.getSubject() + "\n";
Multipart mp = (Multipart) m.getContent();
for ( int j = 0; j < mp.getCount(); j++ )
{
Part part = mp.getBodyPart( j );
String disposition = part.getDisposition();
if ( disposition == null )
{
MimeBodyPart mimePart = (MimeBodyPart)part;
if ( mimePart.isMimeType("text/plain") )
{
BufferedReader in = new BufferedReader(
new InputStreamReader(mimePart.getInputStream()) );
for ( String line; (line=in.readLine()) != null; )
mail += line + "\n";
}
}
}
}
folder.close( false );
store.close();
return mail;
}
}


Ich habe bereits gegoogelt und die Javamail-Doku gewälzt, doch leider hat nichts geholfen. Irgendwer ne Idee?

Grüße
Sai
30.12.2011
Sai 73 1 5
2 Antworten
2
Der "Content" einer Mail kann in unterschiedlichen Typen vorliegen - einfacher Text, HTML, Multipart-Nachrichten... Wie die Doku zu getContent() sehr deutlich sagt, ist der Typ des zurückgegebenen Java-Objekts abhängig davon, was in der Mail drinsteckt. Wenn Du also einfach ins Blaue hinein auf Multipart castest, ist das grob fahrlässig.

Sauber lösen kannst Du das, in dem Du entweder mit getContentType() den Mime-Typ der Message abfragst oder indem Du den Typ des Ergebnisses von getContent() mit instanceof testest. Abhängig vom Typ kannst Du dann casten. JavaMail Quick Start scheint mir einen recht guten Einstieg ins Thema zu geben, und auf Seite 4 hast Du ein Codebeispiel, in dem beide Ansätze benutzt werden.
30.12.2011
Matthias Hlawatsch 13,2k 4 9
0
eine nicht ganz schöne Lösung hab ich gefunden. Wenn ich mir den Content ausgeben lasse, bekomme ich bei Nicht-Multipart-Mails den Mailcontent ausgegeben, bei Multipart eine Java-Ausgabe. Diese werde ich per Regulärem Ausdruck suchen und bei TRUE die Mail entsprechend behandeln.

Also so:
if (Pattern.matches(".*MimeMultipart.*", m.getContent().toString()) == false)
{
mail += "Content: " + m.getContent() + "\n";
}
else
{
Multipart mp = (Multipart) m.getContent();
...


Für eine saubere Lösung wär ich natürlich trotzdem dankbar :-)

Grüße
Sai
30.12.2011
Sai 73 1 5

Stelle deine Java-Frage jetzt!