2014-04-07 3 views
0

MIME 메시지를 구문 분석하는 데 문제가 있습니다. 내가 원하는 특정 첨부 파일이 들어있는 패킷이있는 PCAP 파일이 있습니다. 첨부 파일 하나 (콘텐츠 유형 : 애플리케이션/옥텟 스트림)가 아닌 메일에서 전체 첨부 파일을 검색 할 수 있습니다. 첨부 파일을 여러 개 가져 오려고하면 각 첨부 파일에서 약 70 % 만 얻습니다. Java Mail 파서에 문제가 있습니까? 아니면 제가 잘못하고 있습니까?Java 메일을 사용하여 전체 첨부 파일 콘텐츠를 가져올 수 없습니다.

public ArrayList<Attachment> parseMessage() { 

    ArrayList<Attachment> attachments = new ArrayList<>(); 

      try { 



     Session s = Session.getDefaultInstance(new Properties());  

     InputStream is = new ByteArrayInputStream(parts.getBytes());  

     MimeMessage message = new MimeMessage(s, is); 

      if(!message.getContentType().contains("multipart")) 

      return null; 

      Multipart multipart = (Multipart) message.getContent(); 


     for (int j = 0; j < multipart.getCount(); j++) { 

      Part part = multipart.getBodyPart(j); 


      if (part.getDisposition() != null && part.getDisposition().equals("attachment") && part.getContentType().contains("application")) { 


       attachments.add(new Attachment(this.searchForContent(part),part.getFileName())); 

      } 
     } 

    // } 


    } catch (MessagingException ex) { 

    } catch (IOException ex) { 

    } 

    return attachments; 
    } 



public byte[] searchForContent(Part part) { 

    InputStream is = null; 

    ArrayList<Byte> list = new ArrayList<>(); 

    try { 
     is = part.getInputStream(); 

     int character = 0; 

     while ((character = is.read()) != -1) { 

      list.add((byte) character); 

     } 
    } catch (Exception ex) { 
    } 

    byte[] bytes = new byte[list.size()]; 

    for (int i = 0; i < bytes.length; i++) { 

     bytes[i] = list.get(i); 

    } 
    return bytes; 
} 
+0

힌트 : http://stackoverflow.com/questions/1748183/download-attachments-using-java-mail – Spindizzy

답변

0

바이트 목록? 아뿔싸! 그건 비효율적이야! 바이트 배열에 데이터가 실제로 필요한 경우 ByteArrayOutputStream에 복사 해보십시오.

어쨌든, 내가 작성한 코드에서 콘텐츠의 70 % 만 사용 가능하다는 것을 어떻게 감지하는지 알 수 없습니다. parts.getBytes()가 모든 데이터를 반환하지 않을 가능성이 있습니까? 어떻게 알았어? 문제가있는 테스트 메시지 파일과 함께 완전한 테스트 프로그램을 가지고 있습니까?

어떤 JavaMail 버전을 사용하고 있습니까?

+0

버전 1.5.1을 사용하고 있습니다. 그리고 내가 읽으려고하는 바이트의 길이를 알지 못하기 때문에 유용한 바이트 목록을 발견했습니다. 필자는 테스트를 작성하지 않았지만 pcap에서 전체 TCP 세션을 얻었으므로 Java Mail을 사용하여 구문 분석을 시도하기 전에 Base64로 인코딩 된 전체 첨부 파일이 정상적으로 작동한다는 것을 알 수있었습니다. 70 %는 단지 추측이었습니다. 정확히 95000 %의 경우 78000 바이트 중 512 000에서 491048 바이트, 747519 바이트를 얻습니다. (이전 추측으로 인해 유감스럽게 생각합니다) 어쨌든 두 경우 모두 동일한 비율 손실입니다. – Mayda

관련 문제