ایجاد و سازماندهی فایل‌های PST در پایتون

ایجاد فایل PST جدید و افزودن زیرپوشه‌ها

Aspose.Email قابلیت ایجاد فایل‌های جدول ذخیره‌سازی شخصی (PST) از ابتدا و افزودن زیرپوشه‌ها به آن‌ها را فراهم می‌کند. با PersonalStorage کلاس، می‌توانید عملیات مربوط به فایل‌های PST را که پیام‌های ایمیل، رویدادهای تقویم، مخاطبین و داده‌های دیگر را ذخیره می‌کنند مدیریت کنید.

نمونه کد زیر نشان می‌دهد چگونه یک فایل ذخیره‌سازی جدید ایجاد کرده و یک پوشه "Inbox" به آن اضافه کنید:

  1. از PersonalStorage.create متد برای ایجاد یک فایل PST جدید با دایرکتوری مشخص. فایل با استفاده از UNICODE فرمت برای سازگاری با برنامه‌های مدرن.
  2. به پوشه ریشه‌ی فایل PST دسترسی پیدا کنید و یک زیرپوشه جدید به نام "Inbox" اضافه کنید تا پیام‌های ایمیل را سازماندهی کنید.

بررسی تطبیق کلاس کانتینر

Aspose.Email برای 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 به‌جای اضافه‌ کردن آن‌ها به‌صورت تک‌تک می‌تواند مزایای متعددی بدهد، به‌ویژه در زمینه کارآمدی و عملکرد: عملیات I/O کمتر، زمان تکمیل کار کاهش می‌یابد، منابع سیستم به‌صورت مؤثرتری استفاده می‌شوند، و غیره. متد add_messages مربوط به FolderInfo کلاس برای انتقال مجموعه پیام‌های MAPI به دست آمده از پوشه منبع به پوشه مقصد استفاده می‌شود.

افزودن پیام‌ها از PST دیگر

برای فهرست‌نگاری و بازیابی تمام پیام‌های MAPI از پوشه منبع یک فایل PST، از متد enumerate_mapi_messages() مربوط به 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))