为什么JavaMail BodyPart.getInputStream()在使用IMAP时返回空流,但在使用POP3时却不是?

时间:2014-09-12 16:25:48

标签: java inputstream imap pop3 javax.mail

我有一个javax.mail应用程序可以解析所有InputStream个附件的电子邮件并获取application/*

private DataInputStream getAttachmentStream(Message message) throws MessagingException, IOException {
    if (message.isMimeType("multipart/*")) {
        Multipart mp = (Multipart) message.getContent();

        for (int p = 0; p < mp.getCount(); p++) {
            BodyPart part = mp.getBodyPart(p);

            if (part.getContentType().toLowerCase().startsWith("application")) {
                InputStream is = part.getInputStream();

                DataInputStream dis = new DataInputStream(is);

                App.logger.info("Found attachment."");
                return dis;
            }
        }
    }

    App.logger.warn("No attachment found.");
    return null;
}

我的问题是即使对于有附件的电子邮件,结果DataInputStream也是空的。我已经介入了调试器,part绝对是附件的正确Message部分。

我切换了检查电子邮件地址的代码协议,使用POP3而不是IMAP,这段代码神奇地起作用了。谁能解释为什么这个代码适用于POP3而不适用于IMAP?

1 个答案:

答案 0 :(得分:2)

自从这个线程被打开已经有一段时间了,但我认为这里描述的问题是由于IMAP服务器的部分获取实现中的错误。如本链接http://www.oracle.com/technetwork/java/faq-135477.html#fetch和这些说明https://javamail.java.net/docs/NOTES.txt中所述。有一种解决方法可以解决它,添加以下属性:

  

props.setProperty(&#34; mail.imap.partialfetch&#34;,&#34; false&#34;);