Защищенный паролем excel как вложение почты

#java #jakarta-mail

#java #джакарта-почта

Вопрос:

Я создал jar для отправки почты с использованием java. Я должен прикрепить файл Excel с почтой. Я использую HSSF для создания рабочего листа. Но мне нужно зашифровать вложение паролем. Мне это удалось. Но когда я открываю вложение непосредственно из почты через Outlook, оно не запрашивает пароль. и когда я копирую в любую папку, а затем, если я пытаюсь открыть, она работает правильно. Может кто-нибудь, пожалуйста, помогите?

 public static void main(final String... args) throws Exception {     

        String fname = "D:\Mail\Sample.xls";

        FileInputStream fileInput = null;       
        BufferedInputStream bufferInput = null;      
        POIFSFileSystem poiFileSystem = null;    
        FileOutputStream fileOut = null;

        try {           

            fileInput = new FileInputStream(fname);         
            bufferInput = new BufferedInputStream(fileInput);            
            poiFileSystem = new POIFSFileSystem(bufferInput);            

            Biff8EncryptionKey.setCurrentUserPassword("secret");            
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);            
            HSSFSheet sheet = workbook.getSheetAt(0);           

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!"); 

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);

            File file = new File("D:\Mail\Sample.xls");

            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            try {
                for (int readNum; (readNum = fis.read(buf)) != -1;) {
                    bos.write(buf, 0, readNum); 
                    System.out.println("read "   readNum   " bytes,");
                }
            } catch (IOException ex) {
            }
            byte[] bytes = bos.toByteArray();   

// Code for sending mail         

        } catch (Exception ex) {

            System.out.println(ex.getMessage());      

        } finally {         

              try {            

                  bufferInput.close();     

              } catch (IOException ex) {

                  System.out.println(ex.getMessage());     

              }    

              try {            

                  fileOut.close();     

              } catch (IOException ex) {

                  System.out.println(ex.getMessage());     

              } 
        }       

    }
  

Комментарии:

1. Не могли бы вы опубликовать код, который вы написали для создания и защиты паролем Excel, и отправить его по электронной почте? Без кода этот вопрос очень похож на проблему MS Office, а не на проблему программирования.

2. Конечно… Пожалуйста, проверьте это…

3. Где код для шифрования? Вызов writeProtectWorkbook() просто устанавливает флаг защиты от записи для рабочей книги. Он не шифрует. Из документа: «защитите книгу паролем (не зашифрованным, просто установите флаги защиты от записи и пароль».

4. О, я понимаю. IMHO POI API действительно ужасен в этом отношении…

5. да, мне нужно установить пароль для вложения, чтобы, когда получатель открывал файл, он запрашивал пароль для ввода. Я попробовал с приведенным выше кодом, он работает нормально, но не тогда, когда он отправляется как вложение по почте

Ответ №1:

Метод HSSFWorkbook.writeProtectWorkbook(...) предназначен только для защиты рабочей книги от записи / изменения.
Если вы попытаетесь открыть его в режиме чтения записи (по умолчанию в папках Windows), он запросит у вас пароль.
Но если вы откроете его в режиме только для чтения, что Outlook и делает с вложениями, он позволит вам просмотреть содержимое, поскольку вы не можете писать поверх них и, следовательно, вам не нужен пароль для записи.
По этой причине вы можете просматривать (но не редактировать) его в Outlook, но не при открытии из папки.

Я не знаю, поддерживает ли последняя версия Apache POI полную защиту паролем для HSSFWorkbook (быстрый поиск в Google говорит, что это не так, но кто знает).

Если это не так, вы можете обойти эту проблему, создав защищенный паролем ZIP-файл с excel в нем и прикрепив вместо него ZIP-файл.