Создать новый PST, добавить подпапки и сообщения

Помимо анализа существующего PST‑файла, Aspose.Email предоставляет возможность создать PST‑файл с нуля. В этой статье показано, как создать PST‑файл Outlook и добавить к нему подпапку.

  1. Создание нового PST‑файла.
  2. Изменение класса контейнера папки.
  3. Пакетное добавление сообщений с повышенной производительностью

Используйте PersonalStorage класс для создания PST‑файла в указанном месте на локальном диске. Чтобы создать PST‑файл с нуля:

  1. Создайте PST с помощью PersonalStorage.create() метод.
  2. Добавьте подпапку в корень 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 в следующих методах:

Ниже пример кода, показывающий, как использовать сжатие 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 messages) метод позволяет добавлять сообщения пакетно и может использоваться в следующих сценариях. Кроме того, MessageAdded событие происходит, когда сообщение добавлено в папку.

Добавить сообщения из другого 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"));
}