密码保护的Excel作为邮件附件

时间:2016-10-11 06:38:54

标签: java javamail

我创建了一个用于使用java发送邮件的jar。我必须附上一个带邮件的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 个答案:

答案 0 :(得分:1)

方法HSSFWorkbook.writeProtectWorkbook(...)仅用于保护工作簿不被写入/修改 如果您尝试以读取+写入模式(Windows文件夹中的默认模式)打开它,它将询问您密码 但是,如果你以只读模式打开它,这是Outlook对附件的作用,它会让你查看内容,因为你不能写它们,因此你不需要写密码。登记/> 这就是你可以在Outlook中查看(但不能编辑)它的原因,但是当你从文件夹中打开它时却没有。

我不知道最新版本的Apache POI是否支持HSSFWorkBook的完全密码保护(快速Google搜索说它不是,但谁知道)。

如果没有,您可以通过制作带有excel的受密码保护的ZIP文件并附加ZIP文件来解决此问题。