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

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

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

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

  1. Создайте PST, используя PersonalStorage.create() method.
  2. Добавьте подпапку в корень файла PST, открыв корневую папку и вызвав addSubFolder() method.

В следующем фрагменте кода показано, как создать файл PST и добавить подпапку под названием «Входящие».

// 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 предлагает возможность сжатия основного содержимого, что может помочь уменьшить размер сообщения. Это может быть особенно полезно при отправке больших сообщений или при работе с ограниченной полосой пропускания или ограничениями хранилища. Для этого в библиотеке предусмотрен параметр сжатия, включенный в следующие методы:

В приведенном ниже фрагменте кода показано, как использовать сжатие 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);

Создайте персональное хранилище на основе SeekableByteChannel Stream

Aspose.Email для Java позволяет работать с файлами персонального хранилища (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"));
}