2011-01-13 8 views
3

私はメッセージオブジェクトの本文を読み取るために、次のコードを使用します。プレーン/テキストメッセージを開く必要がある場合、JavamailがIOExceptionをスローするのはなぜですか?

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(); 
} 

コンテンツがマルチパートである場合には、すべてが正常に動作しますが、コンテンツは単なるテキスト/平野であるとき、私は時(次の例外を取得しますすでに行1でのgetContent()の呼び出し):!http://www.oracle.com/technetwork/java/faq-135477.html#mainbody

同じ結果:

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) 

は、私はまた、JavaMailのよくある質問に示すコードを試してみました。

IMAPFolderインスタンスでgetMessages(n)を呼び出してメッセージを取得しました。フォルダインスタンスは、IMAPStoreオブジェクトから取得されます。

私は何が間違っている可能性があるアイデアから完全にです... 誰かいくつかのアイデアを持っていますか?

+0

を自分のコードを書きました。どのIOExceptionがスローされるのですか?メールのメッセージとヘッダーを入力してください。 –

+0

「MimeMessage」はどのように作成されましたか? – dkarp

答えて

5

くそー、問題が見つかりました。 getContent()を呼び出す前にフォルダを開く必要があります。 次のコードは、今うまく動作:

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); 
} 

問題が唯一のプレーン/テキストメールに影響を与えたと私はマルチパートメッセージを取得しようとしたときに発生しなかった理由私はまだちょうど思ったんだけど。

0

私は、スタックトレースが不完全であると考えられる次のように

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(); 
    } 

} 
関連する問題