Создать новый PST, добавить подпапки и сообщения
Помимо анализа существующего PST‑файла, Aspose.Email предоставляет возможность создать PST‑файл с нуля. В этой статье показано, как создать PST‑файл Outlook и добавить к нему подпапку.
- Создание нового PST‑файла.
- Изменение класса контейнера папки.
- Пакетное добавление сообщений с повышенной производительностью
Используйте PersonalStorage класс для создания PST‑файла в указанном месте на локальном диске. Чтобы создать PST‑файл с нуля:
- Создайте PST с помощью PersonalStorage.create() метод.
- Добавьте подпапку в корень PST‑файла, получив доступ к корневой папке и затем вызвав addSubFolder() метод.
Ниже пример кода, показывающий, как создать PST‑файл и добавить подпапку с именем Inbox.
// Create new PST
try (PersonalStorage pst = PersonalStorage.create(path, FileFormatVersion.Unicode)) {
// Add new folder "Test"
pst.getRootFolder().addSubFolder("Inbox");
}
Создание PST размером более 2 ГБ с использованием OutputStream
Пользователи Aspose.Email могут оптимизировать внутренний кеш PST, используя конструктор PersonalStorage:
- blockSize — оптимальный размер блока для расширения буфера кеша (в байтах).
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)
Уменьшить размер сообщения и размер создаваемого PST‑файла
Aspose.Email предоставляет возможность сжимать содержимое тела сообщения, что может помочь уменьшить размер сообщения. Это особенно полезно при отправке больших сообщений или при ограниченной пропускной способности сети и объёме хранилища. Для этой цели библиотека предоставляет параметр compression в следующих методах:
- MapiMessageItemBase.setBodyContent(String content, /BodyContentType/int contentType, boolean compression) - Устанавливает содержимое тела.
- MapiMessageItemBase.setBodyRtf(String content, boolean compression) - Получает или задаёт текст сообщения в формате RTF.
Ниже пример кода, показывающий, как использовать сжатие RTF при установке тела сообщения MAPI:
MapiMessage msg = new MapiMessage("from@doamin.com", "to@domain.com", "subject", "body");
// set the html body and keep it compressed
// this will reduce the message size
msg.setBodyContent(htmlBody, BodyContentType.Html, true);
Создание PersonalStorage на основе потока SeekableByteChannel
Aspose.Email для Java позволяет работать с файлами Personal Storage (PST) с использованием java.nio.channels. Вы можете создать экземпляр PersonalStorage, используя поток SeekableByteChannel. Ниже пример кода, демонстрирующий, как создать экземпляр PersonalStorage на основе потока FileChannel, добавить подпапку с именем "messageFolder" в корневую папку и импортировать сообщения из файлов в каталоге "messageFolder":
try (RandomAccessFile raf = new RandomAccessFile("test.pst", "rw")) {
FileChannel channel = raf.getChannel();
try (PersonalStorage pst = PersonalStorage.create(channel, FileFormatVersion.Unicode)) {
FolderInfo messageFolder = pst.getRootFolder().addSubFolder("messageFolder");
for (File f : new File("messageFolder").listFiles()) {
messageFolder.addMessage(MapiMessage.load(f.getAbsolutePath()));
}
}
}
Изменение класса контейнера папки
Иногда необходимо изменить класс папки. Распространённый пример — когда в одну папку добавляются сообщения разных типов (встречи, письма и т.д.). В таких случаях класс папки нужно изменить для всех элементов, чтобы они корректно отображались. Ниже пример кода, показывающий, как изменить класс контейнера папки в PST для этой цели.
try (PersonalStorage pst = PersonalStorage.fromFile("PersonalStorage1.pst")) {
FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");
folder.changeContainerClass("IPF.Note");
}
Пакетное добавление сообщений с повышенной производительностью
Добавление отдельных сообщений в PST подразумевает больше операций ввода‑вывода на диск и может замедлить работу. Для повышения производительности сообщения можно добавлять в PST пакетным режимом, минимизируя операции ввода‑вывода. addMessages(Iterable
Добавить сообщения из другого PST
Чтобы добавить сообщения из другого PST, используйте FolderInfo.enumerateMapiMessages() метод, который возвращает Iterable<MapiMessage>:
try (PersonalStorage srcPst = PersonalStorage.fromFile("source.pst", false)) {
try (PersonalStorage destPst = PersonalStorage.fromFile("destination.pst")) {
// Get the folder by name
FolderInfo srcFolder = srcPst.getRootFolder().getSubFolder("SomeFolder");
FolderInfo destFolder = destPst.getRootFolder().getSubFolder("SomeFolder");
destFolder.MessageAdded.add(new MessageAddedEventHandler() {
// Handles the MessageAdded event.
public void invoke(Object sender, MessageAddedEventArgs e) {
System.out.println("Added: " + e.getEntryId());
}
});
destFolder.addMessages(srcFolder.enumerateMapiMessages());
}
}
Добавить сообщения из каталога
Чтобы добавить сообщения из каталога, создайте getMessages(String pathToDir) метод, который возвращает Iterable<MapiMessage>:
// Read messages from directory.
static Iterable<MapiMessage> getMessages (String pathToDir)
{
return Arrays.stream(listDirectory(pathToDir, "*.msg"))
.map(MapiMessage::load).collect(Collectors.toList());
}
try ( PersonalStorage pst = PersonalStorage.fromFile("storage.pst")) {
FolderInfo folder = pst.getRootFolder().getSubFolder("SomeFolder");
folder.MessageAdded.add(new MessageAddedEventHandler() {
// Handles the MessageAdded event.
public void invoke(Object sender, MessageAddedEventArgs e) {
System.out.println("Added: " + e.getEntryId());
}
});
folder.addMessages(getMessages("MessageDirectory"));
}