3

次のコードを使用して、メッセージ オブジェクトの本文を読み取ります。

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() 呼び出しで既に!):

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 FAQ に示されているコードも試しました: http://www.oracle.com/technetwork/java/faq-135477.html#mainbody

同じ結果です。

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

何がうまくいかないのか、私は完全にアイデアがありません...誰かアイデアがありますか?

4

2 に答える 2

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

マルチパート メッセージをフェッチしようとしたときに問題がプレーン/テキスト メールのみに影響し、なぜ発生しなかったのか、まだ疑問に思っています。

于 2011-01-13T16:47:52.930 に答える
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();
    }

}
于 2012-07-15T21:09:06.180 に答える