сохранить вложение электронной почты - PullRequest
0 голосов
/ 23 января 2012

Может кто-нибудь предложить мне, как сохранить вложение электронной почты с помощью 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 и выдает ошибку расшифровки. Как сохранить файл без потока? спасибо.

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Проблема в том, что вы используете BufferedReader и BufferedWriter. Они предназначены для использования с символьными потоками. Он преобразует последовательность байтов, которую вы прочитали из вложения, в кодовые точки символов Unicode (тип char) с использованием кодировки платформы по умолчанию и наоборот. В процессе кодирования или декодирования не отображаемые символы могут быть заменены или исключены из потока.

Вы должны использовать обычный InputStream для чтения вложения и FileOutputStream для записи в файл:

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();

Существуют и другие способы копирования содержимого InputStream в OutputStream, см. этот вопрос и ответы .

0 голосов
/ 23 января 2012

Попробуйте это:

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();
 }
...