javax.mail.Part.getContent() ArrayIndexOutOfBoundsException : 16448

标签 java jakarta-mail indexoutofboundsexception

我使用 imap 接收电子邮件。当我收到一封电子邮件时,我需要使用 javax.mail.Part.getContent() api 读取电子邮件的内容,然后我收到异常 java.lang.ArrayIndexOutOfBoundsException: 16448。电子邮件的 mimeType 是 text/html。

我可以获取其他电子邮件中的内容。谁能解释一下原因,以及如何解决。

这是我的代码。

public static void getMailTextContent(Part part, StringBuffer text, StringBuffer textPlain, StringBuffer textHtml) throws MessagingException, IOException {
    boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
    if (part.isMimeType("text/*") && !isContainTextAttach) {
        String content = "";
        try{
            content = (String) part.getContent();
        }catch(UnsupportedEncodingException uex){
            InputStream is = part.getInputStream();
            content = convertIS2String(is);
        } catch (ArrayIndexOutOfBoundsException aioobe) {
            logger.info("ArrayIndexOutOfBoundsException happend.", aioobe);
            throw aioobe;
        } catch (IOException ioe) {
            if (!ioe.getMessage().contains("No content")) {
                throw ioe;
            }
        }
        text.append(content);
        if (part.isMimeType("text/plain")) {
            textPlain.append(content);
        }
        if (part.isMimeType("text/html")) {
            textHtml.append(content);
        }
    } else if (part.isMimeType("message/rfc822")) {
        getMailTextContent((Part) part.getContent(), text, textPlain, textHtml);
    } else if (part.isMimeType("multipart/*")) {
        Multipart multipart = (Multipart) part.getContent();
        int partCount = multipart.getCount();
        for (int i = 0; i < partCount; i++) {
            BodyPart bodyPart = multipart.getBodyPart(i);
            getMailTextContent(bodyPart, text, textPlain, textHtml);
        }
    }
}

这是异常堆栈跟踪。

java.lang.ArrayIndexOutOfBoundsException: 16448
at com.sun.mail.util.ASCIIUtility.toString(ASCIIUtility.java:248) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.FetchResponse.next20(FetchResponse.java:231) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:219) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:96) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:392) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.iap.Protocol.command(Protocol.java:354) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2113) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2105) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.fetchSectionBody(IMAPProtocol.java:1818) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1801) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1790) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.IMAPInputStream.fill(IMAPInputStream.java:156) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:192) ~[javax.mail-1.5.6.jar:1.5.6]
at java.io.FilterInputStream.read(FilterInputStream.java:83) ~[?:1.8.0_121]
at java.io.PushbackInputStream.read(PushbackInputStream.java:139) ~[?:1.8.0_121]
at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:86) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:165) ~[javax.mail-1.5.6.jar:1.5.6]
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_121]
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_121]
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_121]
at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_121]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:98) ~[javax.mail-1.5.6.jar:1.5.6]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[?:1.8.0_121]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[?:1.8.0_121]
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:657) ~[javax.mail-1.5.6.jar:1.5.6]
at com.test.mail.web.api.component.receiver.imap.MailParser.getMailTextContent(MailParser.java:336) ~[classes/:?]
at com.test.mail.web.api.component.receiver.imap.MailParser.getMailTextContent(MailParser.java:369) ~[classes/:?]
at com.test.mail.web.api.component.receiver.imap.MailParser.parseMessage(MailParser.java:92) ~[classes/:?]
at 

这是调试信息。

DEBUG IMAP: ignoring bad response, THROW:com.sun.mail.iap.ParsingException: error in FETCH parsing, unrecognized item at index 16416, starts with "ETCH Completed"
at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:218)
at com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:96)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:414)
at com.sun.mail.iap.Protocol.command(Protocol.java:395)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2158)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2150)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchSectionBody(IMAPProtocol.java:1862)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1845)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1834)
at com.sun.mail.imap.IMAPInputStream.fill(IMAPInputStream.java:157)
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:198)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at java.io.PushbackInputStream.read(PushbackInputStream.java:139)
at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:87)
at com.sun.mail.util.QPDecoderStream.read(QPDecoderStream.java:167)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:101)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795)
at javax.activation.DataHandler.getContent(DataHandler.java:542)
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:683)

最佳答案

我在 Imap 属性中配置“mail.imap.partialfetch”=true 对我有用。 props.setProperty("mail.imap.partialfetch", "false");

我使用POP3而不是IMAP,那么我也可以正确获取邮件正文。

关于javax.mail.Part.getContent() ArrayIndexOutOfBoundsException : 16448,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50872281/

相关文章:

Java Swing - 从鼠标监听器更改 JComponent 不透明度

java - 如何为 Web 应用程序创建一个插件来计算每个调用的方法的执行时间

Java邮件创建DSN(送达状态通知)

java - 无法使用 JavaMail api 连接到 Gmail SMTP

java - 这段代码有什么问题。运行时错误

数组映射上的 Java ArrayIndexOutOfBounds 异常

java - IndexOutOfBoundsException:索引:15,大小:19

java - "Index: 68, Size: 10"是什么意思?

java - 如何使用父类在 Spring Rest Controller 具体类中返回?

java - 如何从 Java 中的装饰器模式中删除装饰对象