Создание и организация PST‑файлов в Python

Создать новый PST‑файл и добавить подпапки

Aspose.Email предоставляет возможность создавать файлы Personal Storage Table (PST) с нуля и добавлять в них подпапки. С помощью PersonalStorage класс, позволяющий управлять операциями с PST‑файлами, в которых хранятся электронные сообщения, календарные события, контакты и другие данные.

Ниже приведён пример кода, показывающий, как создать новый файл хранилища и добавить в него папку "Inbox":

  1. Используйте PersonalStorage.create метод для создания нового PST‑файла в указанном каталоге. Файл создаётся с помощью UNICODE формат для совместимости с современными приложениями.
  2. Получить доступ к корневой папке PST‑файла и добавить новую подпапку с именем "Inbox" для организации электронных сообщений.

Проверка соответствия класса контейнера

Aspose.Email for Python предлагает решение, повышающее процесс проверки при создании папок в PST‑файлах. С помощью свойства enforce_container_class_matching в FolderCreationOptions класс, позволяющий обеспечить строгое соответствие классов контейнеров при добавлении новой папки в PST‑хранилище. Эта функция помогает поддерживать организационную иерархию внутри PST‑файла, предотвращая несоответствия в классах контейнеров. При установке ‘EnforceContainerClassMatching’ в ’true’ будет выброшено исключение, если классы контейнеров родительской и дочерней папок не совпадают, что защищает от неверных структур папок. Значение свойства по умолчанию — ‘false’, что позволяет гибкость при создании папок, одновременно давая возможность принудительно требовать строгого соответствия при необходимости.

Ниже показан пример кода, демонстрирующий использование свойства enforce_container_class_matching для контроля, должно ли вызываться исключение при добавлении папок с несоответствующими классами контейнеров:

with PersonalStorage.create("storage.pst", FileFormatVersion.Unicode) as pst:
    contacts = pst.createpredefinedfolder("Contacts", StandardIpmFolder.Contacts)
    
    # An exception will not arise. EnforceContainerClassMatching is False by default.
    contacts.addsubfolder("Subfolder1", "IPF.Note")
    
    # An exception will occur as the container class of the subfolder being added (IPF.Note)
    # does not match the container class of the parent folder (IPF.Contact).
    contacts.addsubfolder("Subfolder3", FolderCreationOptions(enforcecontainerclassmatching=True, containerclass="IPF.Note"))

Изменение класса контейнера папки

Иногда необходимо изменить класс папки. Распространённый пример – когда в одну папку добавляются сообщения разных типов (встречи, письма и т.д.). В таких случаях класс папки должен быть изменён для всех элементов, чтобы они отображались правильно. Ниже приведён пример кода, показывающий, как изменить класс контейнера папки в PST для этой цели:

Пакетное добавление сообщений с повышенной производительностью

Добавление множества сообщений в PST‑файл одновременно, а не по отдельности, может дать несколько преимуществ, особенно в плане эффективности и производительности: меньше операций ввода‑вывода, сокращение времени выполнения задачи, более эффективное использование системных ресурсов и т.д. Метод add_messages класса FolderInfo класс используется для переноса коллекции MAPI‑сообщений, полученной из исходной папки, в целевую папку.

Добавить сообщения из другого PST

Дляenumerate and retrieve all the MAPI messages from the source folder of a PST file, use the enumerate_mapi_messages() method of the FolderInfo класс. Затем добавить эти сообщения в целевую папку другого PST‑файла.

import aspose.email as ae

src_pst = ae.storage.pst.PersonalStorage.from_file("source.pst", False)
dest_pst = ae.storage.pst.PersonalStorage.from_file("destination.pst")

# Get the folder by name
src_folder = src_pst.root_folder.get_sub_folder("SomeFolder")
dest_folder = dest_pst.root_folder.get_sub_folder("SomeFolder")

dest_folder.add_messages(src_folder.enumerate_mapi_messages())

Добавить сообщения из каталога

Для добавления сообщений из каталога, после открытия файла и получения ссылки на конкретную папку внутри PST‑файла, получить список имён файлов из каталога, указанного переменной "path", и создать пустой список MSG, чтобы загрузить каждый файл как MapiMessage. Добавлять каждое загруженное сообщение в msg_list. Пример кода ниже демонстрирует процесс добавления сообщений из каталога:

import aspose.email as ae
import os

pst = ae.storage.pst.PersonalStorage.from_file("my.pst", False)

# Get the folder by name
folder = pst.root_folder.get_sub_folder("SomeFolder")

dirs = os.listdir("path")
msg_list = []

for file in dirs:
    msg = ae.mapi.MapiMessage.load(file)
    msg_list.append(msg)

folder.add_messages(iter(msg_list))