2013-04-25 2 views
0

Работаю на почтовом клиенте для моего телефона Android с помощью API JavaMail. Если я пытаюсь получить содержимое электронной почты, в я получаю следующий текст в LogCat:Содержание сообщения для исключения строки

ОТ: XXXXXXXXXXXXXXXXXXXXXXXXXX

TO: AG Blasorchester

ПРЕДМЕТ: BITTE DENKT DIE Schwarze MAPPE/RINGORDNER

SendDate: Ср 27 февраля 21:30:49 МЭЗ 2013

CONTENT-TYPE: TEXT/PLAIN; кодировка = изо-8859-1

Содержание сообщения:

Fehler: java.lang.ClassCastException: com.sun.mail.util.QPDecoderStream не может быть приведен к java.lang.String

Это выброшенное исключение: java.lang.ClassCastException: com.sun.mail.util.QPDecoderStream не может быть приведен к java.lang.String

Я использую следующий код, чтобы получить содержание:

public static void dumpPart(Part p) throws Exception { 
    Log.i("Gestartet", "dumpPart Gestartet"); 
    if (p instanceof Message) 
     dumpEnvelope((Message)p); 

    /** Dump input stream .. 

    InputStream is = p.getInputStream(); 
    // If "is" is not already buffered, wrap a BufferedInputStream 
    // around it. 
    if (!(is instanceof BufferedInputStream)) 
     is = new BufferedInputStream(is); 
    int c; 
    while ((c = is.read()) != -1) 
     System.out.write(c); 

    **/ 

    String ct = p.getContentType(); 
    try { 
     pr("CONTENT-TYPE: " + (new ContentType(ct)).toString()); 
    } catch (ParseException pex) { 
     pr("BAD CONTENT-TYPE: " + ct); 
    } 
    String filename = p.getFileName(); 
    if (filename != null) 
     pr("FILENAME: " + filename); 

    /* 
    * Using isMimeType to determine the content type avoids 
    * fetching the actual content data until we need it. 
    */ 
    try{ 
    if (p.isMimeType("text/plain")) { 
     pr("This is plain text"); 
     pr("---------------------------"); 
     if (!showStructure && !saveAttachments) 
     System.out.println((String)p.getContent()); 
    } else if (p.isMimeType("multipart/*")) { 
     pr("This is a Multipart"); 
     pr("---------------------------"); 
     Multipart mp = (Multipart)p.getContent(); 
     level++; 
     int count = mp.getCount(); 
     for (int i = 0; i < count; i++) 
     dumpPart(mp.getBodyPart(i)); 
     level--; 
    } else if (p.isMimeType("message/rfc822")) { 
     pr("This is a Nested Message"); 
     pr("---------------------------"); 
     level++; 
     dumpPart((Part)p.getContent()); 
     level--; 
    } else { 
     if (!showStructure && !saveAttachments) { 
     /* 
     * If we actually want to see the data, and it's not a 
     * MIME type we know, fetch it and check its Java type. 
     */ 
     Object o = p.getContent(); 
     if (o instanceof String) { 
      pr("This is a string"); 
      pr("---------------------------"); 
      System.out.println((String)o); 
     } else if (o instanceof InputStream) { 
      pr("This is just an input stream"); 
      pr("---------------------------"); 
      InputStream is = (InputStream)o; 
      int c; 
      while ((c = is.read()) != -1) 
      System.out.write(c); 
     } else { 
      pr("This is an unknown type"); 
      pr("---------------------------"); 
      pr(o.toString()); 
     } 
     } else { 
     // just a separator 
     pr("---------------------------"); 
     } 

     } 
    }catch(Exception e){ 
     Log.i("Fehler", "Fehler: " + e); 
    } 
} 

Могу ли я получить содержимое сообщения как строку без исключения?

+0

Не знаю, что API, но я предполагаю, что System.out.println ((String) p.getContent()); p.getContent не возвращает строку, ее возвращает декодер, и вам нужно получить данные от него. Ваш другой приведение в строку выглядит нормально. –

+0

Да, я тоже так думаю, но если я использую System.out.println ((String) p.getContent(). ToString()), я получаю ту же ошибку, и я не знаю, почему. В каждом учебном пособии JavaMail или в демонстрационной программе используется тот же код, и он, кажется, запускается. Почему не в моей заявке? – jwandscheer

+0

Возможный дубликат [Получение содержимого электронной почты html в JavaMail] (http://stackoverflow.com/questions/15987472/getting-html-email-content-in-javamail) –

ответ

0

Есть ли какие-либо немецкие специальные символы в части From: XXXX в вашем примере или где-либо еще в заголовках? Электронная почта кодируется RFC 2047, которая происходит, когда заголовки электронной почты содержат non-US ASCII символов.

Этот код может работать. Полностью непроверенный, поскольку у меня нет настройки среды, но может быть отправной точкой.

if (p.isMimeType("text/plain")) { 
    pr("This is plain text"); 
    pr("---------------------------"); 
    if (!showStructure && !saveAttachments) { 
    if (p.getContent instanceof String) { 
     System.out.println((String)p.getContent()); 
    } else if (p.getContent() instanceof QPDecoderStream) { 
     BufferedInputStream bis = new BufferedInputStream(p.getContent()); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     while (true) { 
     int c = bis.read(); 
     if (c == -1) { 
      break; 
     } 
     baos.write(c); 
     } 
     System.out.println(new String(baos.toByteArray())); 
    } else { 
     //Handle different content types 
    } 
    } 
} 
+0

Спасибо, я решил это с помощью InputStream :) – jwandscheer

Смежные вопросы