Crear Nuevo PST, Añadir Subcarpetas y Mensajes

Además de analizar un archivo PST existente, Aspose.Email ofrece la posibilidad de crear un archivo PST desde cero. Este artículo muestra cómo crear un archivo PST de Outlook y añadirle una subcarpeta.

  1. Crear un nuevo archivo PST.
  2. Cambiar la clase de contenedor de una carpeta.
  3. Añadir mensajes en bloque con rendimiento mejorado

Utilice el PersonalStorage clase para crear un archivo PST en una ubicación del disco local. Para crear un archivo PST desde cero:

  1. Crear un PST usando el PersonalStorage.create() método.
  2. Añade una subcarpeta en la raíz del archivo PST accediendo a la carpeta Root y luego llamando al addSubFolder() método.

El siguiente fragmento de código muestra cómo crear un archivo PST y añadir una subcarpeta llamada Inbox.

// Create new PST
try (PersonalStorage pst = PersonalStorage.create(path, FileFormatVersion.Unicode)) {
    // Add new folder "Test"
    pst.getRootFolder().addSubFolder("Inbox");
}

Crear PST con tamaño superior a 2 Gb usando OutputStream

Los usuarios de Aspose.Email pueden optimizar la caché interna del PST usando el constructor PersonalStorage:

  • blockSize - El tamaño de bloque óptimo para expandir el búfer de caché (en bytes).
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)

Reducir el tamaño del mensaje y el tamaño del archivo PST creado

Aspose.Email ofrece la capacidad de comprimir el contenido del cuerpo, lo que puede ayudar a reducir el tamaño del mensaje. Esto puede ser particularmente útil al enviar mensajes grandes o al lidiar con limitaciones de ancho de banda o de almacenamiento. Con este fin, la biblioteca proporciona el parámetro de compresión incluido en los siguientes métodos:

El siguiente fragmento de código demuestra cómo usar compresión RTF al establecer el cuerpo del mensaje 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);

Crear PersonalStorage basado en un flujo SeekableByteChannel

Aspose.Email para Java permite trabajar con archivos de Almacenamiento Personal (PST) usando java.nio.channels. Permite crear una instancia de PersonalStorage usando un flujo SeekableByteChannel. El siguiente fragmento de código demuestra cómo crear una instancia de PersonalStorage basada en un flujo FileChannel, añadir una subcarpeta llamada "messageFolder" a la carpeta raíz e importar mensajes desde archivos en el directorio "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()));
        }
    }
}

Cambiar la clase de contenedor de una carpeta

A veces es necesario cambiar la clase de una carpeta. Un ejemplo común es cuando se añaden mensajes de diferentes tipos (citas, mensajes, etc.) a la misma carpeta. En dichos casos, la clase de la carpeta debe cambiarse para que todos los elementos se muestren correctamente. El siguiente fragmento de código muestra cómo cambiar la clase de contenedor de una carpeta en PST para este propósito.

try (PersonalStorage pst = PersonalStorage.fromFile("PersonalStorage1.pst")) {
    FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");

    folder.changeContainerClass("IPF.Note");
}

Añadir mensajes en bloque con rendimiento mejorado

Añadir mensajes individuales a un PST implica más operaciones de E/S al disco y puede ralentizar el rendimiento. Para mejorar el rendimiento, los mensajes pueden añadirse al PST en modo por lotes para minimizar las operaciones de E/S. El addMessages(Iterable messages) el método te permite añadir mensajes en bloque y puede usarse en los siguientes escenarios. Además, el MessageAdded evento que ocurre cuando se añade un mensaje a la carpeta.

Añadir mensajes desde otro PST

Para añadir mensajes desde otro PST, usa el FolderInfo.enumerateMapiMessages() método que devuelve 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());
    }
}

Añadir mensajes desde directorio

Para añadir mensajes desde un directorio, crea el getMessages(String pathToDir) método que devuelve 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"));
}