2012-01-23 3 views
0

누구든지 Java를 사용하여 전자 메일 첨부 파일을 저장하는 방법을 제안 할 수 있습니까? 암호화 된 파일 (PGP)입니다. 저장하고 암호 해독에 사용해야합니다. 이 코드를 사용합니다 :전자 메일 첨부 파일 저장

String host = "mail.foxbox.lt"; 
String user = "user"; 
String password = "pass"; 
Properties properties = System.getProperties(); 

Session session = Session.getDefaultInstance(properties); 
Store store = session.getStore("pop3"); 
store.connect(host, user, password); 
Folder folder = store.getFolder("inbox"); 
folder.open(Folder.READ_WRITE); 

Message[] message = folder.getMessages(); 
for (int a = message.length-1; a < message.length; a++) { 
    Multipart multipart = (Multipart) message[a].getContent(); 
    for (int i = 0; i < multipart.getCount(); i++) { 
      BodyPart bodyPart = multipart.getBodyPart(i); 
      InputStream stream = bodyPart.getInputStream(); 
      if (Part.ATTACHMENT.equals(bodyPart.getDisposition())) { 
       BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
       FileWriter fstream = new FileWriter("AAA001.txt.pgp"); 
       BufferedWriter out = new BufferedWriter(fstream); 

       int y; 
       while ((y = stream.read()) != -1) { 
        out.write(y); 
       } 
       stream.close(); 
       out.close(); 
      } 
    } 
    System.out.println(); 
} 
folder.close(true); 
store.close(); 

그러나 텍스트 파일 (문자열)에서만 작동합니다. 내 경우에는 .pgp 파일을 변경하고 암호 해독 오류가 발생합니다. 스트림없이 파일을 저장하려면 어떻게해야합니까? 덕분에 .

답변

0

이 시도 :

String host = "host"; 
String user = "user"; 
String password = "pass"; 
Properties properties = System.getProperties(); 
Session session = Session.getDefaultInstance(properties); 
Store store = session.getStore("pop3"); 
store.connect(host, user, password); 
Folder folder = store.getFolder("inbox"); 
folder.open(Folder.READ_WRITE); 
Message[] message = folder.getMessages(); 
for (int a = message.length-1; a < message.length; a++) { 
     Multipart multipart = (Multipart) message[a].getContent();  
    for (int i = 0; i < multipart.getCount(); i++) { 
     BodyPart bodyPart = multipart.getBodyPart(i);   
     InputStream is = bodyPart.getInputStream(); 
     File f = new File("/tmp/" + bodyPart.getFileName()); 
     FileOutputStream fos = new FileOutputStream(f); 
     byte[] buf = new byte[4096]; 
     int bytesRead; 
     while((bytesRead = is.read(buf))!=-1) { 
      fos.write(buf, 0, bytesRead); 
     } 
     fos.close(); 
     attachments.add(f); 
    } 
    } 
    folder.close(true); 
    store.close(); 
} 
3

문제는 당신이 BufferedReaderBufferedWriter을 사용하는 것입니다. 이들은 문자 스트림과 함께 사용하기위한 것입니다. 그러면 기본 플랫폼 인코딩을 사용하여 첨부 파일에서 읽은 바이트 시퀀스가 ​​유니 코드 문자 코드 포인트 (char 유형)로 변환되며 반대의 경우도 마찬가지입니다. 인코딩 또는 디코딩 프로세스 중에 매핑 할 수없는 문자가 스트림에서 대체되거나 제외 될 수 있습니다.

당신은 파일에 기록 첨부 파일 및 FileOutputStream를 읽는 일반 InputStream을 사용해야합니다 :

OutputStreamInputStream의 내용을 복사하는 다른 방법이 있습니다
InputStream stream = bodyPart.getInputStream(); 
if (Part.ATTACHMENT.equals(bodyPart.getDisposition())) { 
    FileOutputStream fstream = new FileOutputStream("AAA001.txt.pgp"); 

    byte[] buffer = new byte[1024]; 
    int len; 
    while ((len = stream.read(buffer)) != -1) { 
     fstream.write(buffer, 0, len); 
    } 

    fstream.close(); 
} 
stream.close(); 

, this question and the answers를 참조하십시오.

+0

감사합니다. :) 빠른 답변 + 명확한 설명 + 코드! 완전한! – user1164545

+0

@ user1164545 당신은 답을 좋아 했습니까? 그래서 upvote하고 정답으로 표시하십시오 ... – m0skit0

관련 문제