【问题标题】:Stream Closed exception is thrown when 'mail.pop3.filecache.enabled' is true'mail.pop3.filecache.enabled' 为 true 时引发 Stream Closed 异常
【发布时间】:2012-01-04 02:28:15
【问题描述】:

我已经编写了一个基于 Java 的独立程序(使用 JavaMail API v1.4.4)来读取来自 POP3 服务器的电子邮件消息,并且我还使用以下方法将属性 mail.pop3.filecache.enable 设置为 true

props.put("mail.pop3.filecache.enable", "true");

始终如一地,我从message.getContent() 方法获得以下运行时Stream Closed 异常,用于特定 电子邮件消息:

异常追踪:

java.lang.RuntimeException: Stream closed
    at javax.mail.util.SharedFileInputStream.newStream(SharedFileInputStream.java:507)
    at com.sun.mail.pop3.POP3Message.getContentStream(POP3Message.java:242)
    at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:98)
    at com.sun.mail.handlers.text_plain.getContent(text_plain.java:107)
    at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:774)
    at javax.activation.DataHandler.getContent(DataHandler.java:521)
    at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1419)
    at ReadPop3Email.readPOP3Account(ReadPop3Email.java:290)
    at ReadPop3Email.main(ReadPop3Email.java:73)

ReadPop3Email.java的第290行如下:

Object object = message.getContent();

但是,如果我将 mail.pop3.filecache.enable 设置为 false,我看不到任何异常。但是,我们希望将属性 mail.pop3.filecache.enable 用于 true,因为它会将消息数据缓存在临时文件中,而不是内存中,根据 JavaMail 文档。

为什么启用filecache 时会出现此异常?怎么了?非常感谢任何帮助/建议。如果这很重要,我正在使用 JDK1.6。

编辑: 虽然我无法分享/发布原始源代码,但我已将原始源代码的修改版本粘贴在下面。

public class ReadPop3Email
{

    public static void main(String[] args)
    {
        System.setProperty("mail.mime.parameters.strict", "false");
        System.setProperty("mail.mime.ignoremultipartencoding", "false");

        ReadPop3Email pop3Email = new ReadPop3Email();
        pop3Email.readPOP3Account();
    }

    public static String[] getPOP3Info()
    {
        return new String[]{"mypop3host.net", "110", "jack@example.net", "password"};
    }

    public Properties getPOP3Properties()
    {
        Properties props = new Properties();
        props.put("mail.pop3.timeout", "30000");
        props.put("mail.pop3.connectiontimeout", "10000");
        props.put("mail.pop3.filecache.enable", "true");
        return props;
    }

    public void readPOP3Account()
    {
        String server = getPOP3Info()[0];
        int port = Integer.parseInt(getPOP3Info()[1]);
        String username = getPOP3Info()[2];
        String password = getPOP3Info()[3];
        Session session = null;
        Store store = null;
        Folder folder = null;
        POP3Folder pf = null;
        Message message = null;
        Message[] messages = null;
        try {
            System.out.println("-------------- Started processing POP3 account: " + username + " -----------------");
            session = Session.getInstance(getPOP3Properties());

            System.out.println("Getting the session for accessing email.");
            store = session.getStore("pop3");

            store.connect(server, port, username, password);
            System.out.println("Connection established with POP3 server.");

            folder = store.getDefaultFolder();

            folder = folder.getFolder("inbox");
            System.out.println("Getting the Inbox folder.");

            folder.open(Folder.READ_ONLY);

            pf = (POP3Folder) folder;
            System.out.println("Total messages found: " + folder.getMessageCount());

            messages = folder.getMessages();

            //Message no. 26 is the one having this issue
            message = messages[26 - 1];

            System.out.println("Message number: " + message.getMessageNumber());
            System.out.println("Message UID: " + pf.getUID(message));
            System.out.println("From: " + message.getFrom()[0].toString());
            System.out.println("Subject: " + message.getSubject());
            System.out.println("Received date: " + message.getReceivedDate());
            System.out.println("Sent date: " + message.getSentDate());
            System.out.println("Content Type: " + message.getContentType());
            System.out.println("Disposition: " + message.getDisposition());
            boolean isMultipart = (message.getContent() instanceof Multipart);
            System.out.println("Message is multipart? " + isMultipart);

            if (!isMultipart) {
                getBodyContent(message);
            }

            folder.close(true);
            store.close();

            System.out.println("-------------- Completed processing POP3 account: " + username + " -----------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void getBodyContent(Message message)
    {
        try 
        {
            System.out.println("============== BODY CONTENT STARTS HERE ==============");
            Object object = message.getContent();
            if (object instanceof String) {
                System.out.println("STRING content follows below: \n" + (String) object);
            } else if (object instanceof InputStream) {
                System.out.println("INPUTSTREAM content");
                InputStream is = (InputStream) object;
                int c;
                while ((c = is.read()) != -1) {
                    System.out.write(c);
                }
            }
            System.out.println("============== BODY CONTENT ENDS HERE ==============");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

【问题讨论】:

  • 你能多加一点吗? 290?例如。至少约 20 行,所以我们看看你在做什么......(你可以分享整个方法......完全没问题!)
  • @OndrejKvasnovsky:粘贴在我的原始源代码稍作修改的版本之上。

标签: java file-io jakarta-mail pop3


【解决方案1】:

请记住,当文件夹关闭或 JVM 终止时,文件缓存会被删除。

【讨论】:

  • 虽然我无法分享/发布原始源代码,但我在上面粘贴了原始源代码的略微修改版本。
  • 但我认为,在这种情况下,这不是问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-07
  • 2018-11-12
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多