创建新 PST,添加子文件夹和邮件

除了能够解析已有的 PST 文件,Aspose.Email 还提供了从头创建 PST 文件的功能。本文演示如何创建一个 Outlook PST 文件并向其添加子文件夹。

  1. 创建一个新的 PST 文件.
  2. 更改文件夹的容器类.
  3. 批量添加消息以提升性能

使用 PersonalStorage 类在本地磁盘的某个位置创建 PST 文件。要从头创建 PST 文件:

  1. 使用 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");
}

使用 OutputStream 创建大于 2Gb 的 PST

Aspose.Email 用户可以通过 PersonalStorage 构造函数优化 PST 的内部缓存:

  • blockSize - 扩展缓存缓冲区的最佳块大小(字节)。
PersonalStorage create(OutputStream stream, int blockSize, /*FileFormatVersion*/int version)

减小消息大小和生成的 PST 文件大小

Aspose.Email 提供压缩正文内容的功能,可帮助减小消息大小。此功能在发送大邮件或面对带宽或存储限制时尤为有用。为此,库在以下方法中提供了 compression 参数:

以下代码片段演示了在设置 MAPI 消息正文时如何使用 RTF 压缩:

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 流创建 PersonalStorage

Aspose.Email for Java 通过 java.nio.channels 使得可以处理个人存储(PST)文件。您可以使用 SeekableByteChannel 流创建 PersonalStorage 实例。以下代码片段演示了如何基于 FileChannel 流创建 PersonalStorage 实例,向根文件夹添加名为 "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 添加消息会导致更多磁盘 I/O 操作,可能降低性能。为提升性能,可采用批量模式将消息添加到 PST,以最小化 I/O 操作。 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"));
}