Почему Javamail выдает IOException, если нужно открыть текстовое сообщение? - PullRequest
3 голосов
/ 13 января 2011

Я использую следующий код для чтения тела объекта сообщения:

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

Когда контент состоит из нескольких частей, все работает нормально, но когда контент просто текстовый / обычный, я получаю следующее исключение (при вызове getContent () в строке 1 уже!):

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)

Я также попробовал код, показанный в FAQ по JavaMail: http://www.oracle.com/technetwork/java/faq-135477.html#mainbody

Тот же результат.

Сообщение было получено с помощью вызова getMessages (n) для экземпляра IMAPFolder. Экземпляр папки происходит из объекта IMAPStore.

У меня совершенно нет идей, что может пойти не так ... У кого-нибудь есть идеи?

Ответы [ 2 ]

5 голосов
/ 13 января 2011

Блин, я нашел проблему. Мне нужно открыть папку ДО вызова 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 голосов
/ 16 июля 2012

Я написал свой код следующим образом

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

}
...