2011-01-13 5 views
3

Ich verwende den folgenden Code, den Körper eines Nachrichtenobjekts zu lesen:Warum wirft Javamail eine IOException, wenn eine Plain/Text-Nachricht geöffnet werden soll?

Object content = _message.getContent(); 
String body = null; 
if (content instanceof String) { 
    body = (String) content; 
} else if (content instanceof Multipart) { 
    Multipart multipart = (Multipart) content; 
    BodyPart part = multipart.getBodyPart(0); 
    body = (String) part.getContent(); 
} 

Wenn der Inhalt mehrteiliger ist, alles funktioniert gut, aber wenn der Inhalt nur text/plain ist, erhalte ich die folgende Ausnahme (bei die getContent() -Aufruf in Zeile 1 bereits):

13.01.2011 17:22:23 org.zkoss.zk.ui.impl.UiEngineImpl handleError:1253 
SCHWERWIEGEND: >>org.zkoss.zk.ui.UiException: java.io.IOException 
java.io.IOException 
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:108) 
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:90) 
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:775) 
at javax.activation.DataHandler.getContent(DataHandler.java:522) 
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1396) 

ich habe auch versucht, den Code in der FAQ Java Mail angezeigt: http://www.oracle.com/technetwork/java/faq-135477.html#mainbody

gleiches Ergebnis.

Die Nachricht wurde abgerufen, indem getMessages (n) auf einer IMAPFolder-Instanz aufgerufen wurde. Die Ordnerinstanz stammt von einem IMAPStore-Objekt.

Ich bin völlig aus Ideen, was könnte schief gehen ... Hat jemand einige Ideen?

+0

Die stacktrace unvollständig zu sein scheint. Welche IOException wird ausgelöst? Bitte geben Sie die Nachricht + Kopfzeilen der E-Mail an. –

+0

Und wie wurde die 'MimeMessage' erstellt? – dkarp

Antwort

5

Verdammt, ich habe das Problem gefunden. Ich muss den Ordner VOR dem Aufruf von getContent() öffnen. Der folgende Code funktioniert gut jetzt:

Folder folder = _message.getFolder(); 
// Open folder in read-only mode 
if (folder.isOpen()) { 
    if ((folder.getMode() & Folder.READ_WRITE) != 0) { 
     folder.close(false); 
     folder.open(Folder.READ_ONLY); 
    } 
} else { 
    folder.open(Folder.READ_ONLY); 
} 

Object content = _message.getContent(); 
String body = null; 
if (content instanceof String) { 
    body = (String) content; 
} else if (content instanceof Multipart) { 
    Multipart multipart = (Multipart) content; 
    BodyPart part = multipart.getBodyPart(0); 
    body = (String) part.getContent(); 
} 
if (folder.isOpen()) { 
    folder.close(false); 
} 

Ich bin immer noch frage mich, warum das Thema nur plain/Text-E-Mails betroffen und trat nicht auf, wenn ich mehrteilige Nachrichten zu holen versucht.

0

schrieb ich meinen Code in Art und Weise folgende

public void setBody(Message msg) { 

    try { 
     if (msg.isMimeType("text/plain") || msg.isMimeType("text/html")) { 
      try { 
       // body += (String) msg.getContent() + " "; 

       if (msg.getContent() instanceof String) { 
        body += (String) msg.getContent() + " "; 
       } 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 

      } 
     } 
     else if (msg.getContent() instanceof Multipart) { 

      Multipart multipart = null; 
      try { 
       multipart = (Multipart) msg.getContent(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      boolean flag = false; 
      for (int i = 0; i < multipart.getCount(); i++) { 
       BodyPart bodyPart = multipart.getBodyPart(i); 

       String disposition = bodyPart.getDisposition(); 

       if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) { 
        if (!flag) { 
         flag = true; 
        } 

        javax.activation.DataHandler handler = bodyPart.getDataHandler(); 
        String filename = handler.getName(); 
        body += filename + " "; 
       } else { 
        String bodyText = null; 
        try { 
         bodyText = GetMessageBodyText(bodyPart); 
        } catch (IOException e) { 

         e.printStackTrace(); 
        } 
        body += bodyText + " "; 
       } 
      } 
     } 
    } catch (MessagingException e) { 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

}