#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-файл.