2012-01-02 6 views
0

Java 기반 독립 실행 형 프로그램 (JavaMail API v1.4.4 사용)을 작성하여 POP3 서버에서 이메일 메시지를 읽었습니다.'mail.pop3.filecache.enabled'가 true 일 때 스트림 닫힌 예외가 발생합니다.

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

을 지속적으로, 나는 특정 이메일 메시지를 message.getContent() 방법에서 다음 런타임 Stream Closed 예외를 받고 있어요 :

도 사용 사실에 재산 mail.pop3.filecache.enable을 설정 0

예외 stracktrace : ReadPop3Email.java

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) 

라인 no.290는 다음과 같다 : 내가 설정 한 경우,

Object object = message.getContent();

그러나 mail.pop3.filecache.enable-거짓, I 돈 어떤 예외도 보이지 않습니다. 그러나, mail.pop3.filecache.enable에서 까지의 속성을 사용하기를 원합니다. 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", "[email protected]", "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(); 
     } 
    } 

} 
+0

조금 더 추가 할 수 있습니까? nr. 290? 예 : ~ 20 라인 이상이 필요합니다. (모든 방법을 공유 할 수 있습니다 ... 전혀 문제가 없습니다!) –

+0

@OndrejKvasnovsky : 원본 소스 코드를 약간 수정 한 버전 위에 붙여 넣었습니다. – Gnanam

답변

0

폴더가 닫히거나 JVM이 종료되면 파일 캐시가 제거된다는 점에 유의하십시오.

+0

원본 소스 코드를 공유/게시 할 수 없지만 원본 소스 코드를 약간 수정 한 버전 위에 붙여 넣었습니다. – Gnanam

+0

그러나 나는이 경우 문제가 아니라고 생각합니다. – Gnanam

관련 문제