إنشاء وإدارة ملفات PST

بالإضافة إلى تحليل ملف PST موجود، توفر Aspose.Email الوسيلة لإنشاء ملف PST من الصفر. توضح هذه المقالة كيفية إنشاء ملفات Outlook PST وإضافة مجلدات فرعية أو رسائل إليها.

إنشاء ملفات PST

لإنشاء ملف PST جديد على قرص محلي، ستحتاج إلى استخدام الـ PersonalStorage class. باستخدام هذه الفئة، يمكنك إنشاء، قراءة، والتعامل مع ملفات PST في تطبيقات .NET الخاصة بك. أنشئ ملف تخزين من الصفر بسطر واحد من الكود:

// Create new PST
using var pst = PersonalStorage.Create(path, FileFormatVersion.Unicode);

إضافة مجلدات فرعية إلى PST

أضف مجلدًا فرعيًا في جذر ملف PST عبر الوصول إلى المجلد الجذري ثم استدعاء الـ AddSubFolder طريقة.

تظهر لك الشفرة البرمجية التالية كيفية إضافة مجلد فرعي يسمى Inbox:

// Add new folder "Test"
pst.RootFolder.AddSubFolder("Inbox");

تحقق من فئة حاوية المجلد

عند إنشاء مجلدات جديدة أو إضافة عناصر إلى مجلدات موجودة، من المهم التأكد من أن فئة الحاوية للعنصر أو المجلد الجديد تتطابق مع فئة الحاوية للمجلد الأب للحفاظ على التسلسل الهرمي التنظيمي داخل ملف تخزين PST. لهذا الغرض، توفر Aspose.Email الـ EnforceContainerClassMatching خاصية الـ FolderCreationOptions class. الخاصية تحدد ما إذا كان يجب فرض فحص فئة الحاوية للمجلد المضاف مقابل فئة الحاوية للمجلد الأب. إذا تم تعيينه إلى ’true’، سيتم رمي استثناء إذا لم تتطابق فئات الحاوية. الافتراضي هو ‘false’.

يعرض عينة الكود التالية استخدام الـ EnforceContainerClassMatching خاصية للتحكم فيما إذا كان يجب رمي استثناء عند إضافة مجلدات ذات فئات حاوية غير متطابقة:

using (var pst = PersonalStorage.Create("storage.pst", FileFormatVersion.Unicode))
{
    // Create a standard Contacts folder with the IPF.Contacts container class.
    var 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", new FolderCreationOptions {EnforceContainerClassMatching = true, ContainerClass = "IPF.Note"});
}

ملاحظة: تأكد من التعامل السليم مع الاستثناءات عند تطبيق مطابقة فئة الحاوية لتجنب سلوك غير متوقع أثناء إنشاء المجلد في PST.

تغيير فئة حاوية المجلد

في بعض الأحيان يكون من الضروري تغيير فئة حاوية المجلد. مثال شائع هو عندما تُضاف رسائل بأنواع مختلفة (مواعيد، رسائل، إلخ) إلى نفس المجلد. في هذه الحالات، يجب تغيير فئة المجلد لجميع العناصر داخل المجلد لتظهر بشكل صحيح. يوضح المقتطف البرمجي التالي كيفية تغيير فئة الحاوية لمجلد في PST لهذا الغرض.

using var pst = PersonalStorage.FromFile("PersonalStorage1.pst);
var folder = pst.RootFolder.GetSubFolder("Inbox");

folder.ChangeContainerClass("IPF.Note");

إضافة ملفات إلى PST

الوظيفة الأساسية في Microsoft Outlook هي إدارة البريد الإلكتروني، التقويمات، المهام، جهات الاتصال وإدخالات السجل. بالإضافة إلى ذلك، يمكن أيضًا إضافة ملفات إلى مجلد PST ويحافظ PST الناتج على سجل المستندات المضافة. يوفر Aspose.Email إمكانية إضافة ملفات إلى مجلد بنفس الطريقة مع إضافة الرسائل، جهات الاتصال، المهام وإدخالات السجل إلى PST. يوضح المقتطف البرمجي التالي كيفية إضافة مستندات إلى مجلد PST باستخدام Aspose.Email.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (var personalStorage = PersonalStorage.Create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode))
{
    var folder = personalStorage.RootFolder.AddSubFolder("Files");

    // Add Document.doc file with the "IPM.Document" message class by default.
    folder.AddFile(dataDir + "attachment_1.doc", null);
}

إضافة رسائل إلى ملفات PST

باستخدام Aspose.Email يمكنك إضافة رسائل إلى المجلدات الفرعية لملف PST الذي قمت بإنشائه أو تحميله. يضيف هذا المقال رسالتين من القرص إلى مجلد Inbox الفرعي في PST. استخدم الـ PersonalStorage و FolderInfo فئات لإضافة رسائل إلى ملفات PST. لإضافة رسائل إلى مجلد Inbox في ملف PST:

  1. أنشئ مثالا من فئة FolderInfo وحمّله بمحتويات مجلد Inbox.
  2. إضافة رسائل من قرص إلى مجلد Inbox عن طريق استدعاء FolderInfo.AddMessage() طريقة. الـ FolderInfo الفئة تكشف عن الـ AddMessages طريقة تمكّن من إضافة عدد كبير من الرسائل إلى المجلد، مما يقلل عمليات الإدخال/الإخراج إلى القرص ويحسن الأداء.

يعرض المقتطف البرمجي أدناه كيفية إضافة رسائل إلى المجلد الفرعي Inbox في PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create new PST            
var personalStorage = PersonalStorage.Create(dataDir, FileFormatVersion.Unicode);

// Add new folder "Inbox"
personalStorage.RootFolder.AddSubFolder("Inbox");

// Select the "Inbox" folder
var inboxFolder = personalStorage.RootFolder.GetSubFolder("Inbox");

// Add some messages to "Inbox" folder
inboxFolder.AddMessage(MapiMessage.FromFile(RunExamples.GetDataDir_Outlook() + "MapiMsgWithPoll.msg"));

إضافة رسائل دفعة واحدة بأداء محسّن

إضافة رسائل فردية إلى PST يتطلب عمليات إدخال/إخراج أكثر إلى القرص وقد يبطئ الأداء. لتحسين الأداء، يمكن إضافة الرسائل إلى PST في وضع الدفعة لتقليل عمليات الإدخال/الإخراج. الـ AddMessages تتيح الطريقة إضافة رسائل بالجملة ويمكن استخدامها كما في السيناريوهات التالية. بالإضافة إلى ذلك، الـ MessageAdded الحدث يحدث عند إضافة رسالة إلى المجلد.

إضافة رسائل من PST آخر

لإضافة رسائل من PST آخر، استخدم الـ FolderInfo.EnumerateMapiMessages طريقة تُرجع IEnumerable<MapiMessage>:

using var srcPst = PersonalStorage.FromFile(@"source.pst", false);
using var destPst = PersonalStorage.FromFile(@"destination.pst");

// Get the folder by name
var srcFolder = srcPst.RootFolder.GetSubFolder("SomeFolder");
var destFolder = destPst.RootFolder.GetSubFolder("SomeFolder");

destFolder.MessageAdded += new MessageAddedEventHandler(OnMessageAdded);
destFolder.AddMessages(srcFolder.EnumerateMapiMessages());


// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

إضافة رسائل من دليل

لإضافة رسائل من دليل، أنشئ الـ GetMessages(string pathToDir) طريقة مكررة مسماة تُعيد IEnumerable<MapiMessage>:

using var pst = PersonalStorage.FromFile(@"storage.pst");
var folder = pst.RootFolder.GetSubFolder("SomeFolder");
folder.MessageAdded += OnMessageAdded;
folder.AddMessages(GetMessages(@"MessageDirectory"));

// Named iterator method to read messages from directory.
static IEnumerable<MapiMessage> GetMessages(string pathToDir)
{
    string[] files = Directory.GetFiles(pathToDir, "*.msg");

    foreach (var file in files)
    {
        yield return MapiMessage.Load(file);
    }
}

// Handles the MessageAdded event.
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine($"Added: {e.EntryId}");
}

تحميل الرسائل من القرص

يوضح المقتطف البرمجي التالي كيفية تحميل الرسائل من قرص.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static void AddMessagesInBulkMode(string fileName, string msgFolderName)
{
    using (PersonalStorage personalStorage = PersonalStorage.FromFile(fileName))
    {
        FolderInfo folder = personalStorage.RootFolder.GetSubFolder("myInbox");
        folder.MessageAdded += OnMessageAdded;
        folder.AddMessages(new MapiMessageCollection(msgFolderName));
    }
}
static void OnMessageAdded(object sender, MessageAddedEventArgs e)
{
    Console.WriteLine(e.EntryId);
    Console.WriteLine(e.Message.Subject);
}

تنفيذ IEnumerable

يوضح المقتطف البرمجي التالي كيفية استخدام تنفيذ IEnumerable.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public class MapiMessageCollection : IEnumerable<MapiMessage>
{
    private string path;

    public MapiMessageCollection(string path)
    {
        this.path = path;
    }

    public IEnumerator<MapiMessage> GetEnumerator()
    {
        return new MapiMessageEnumerator(path);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MapiMessageEnumerator : IEnumerator<MapiMessage>
{
    private readonly string[] files;

    private int position = -1;

    public MapiMessageEnumerator(string path)
    {
        string path1 = RunExamples.GetDataDir_Outlook();
        files = Directory.GetFiles(path1);
    }

    public bool MoveNext()
    {
        position++;
        return (position < files.Length);
    }

    public void Reset()
    {
        position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public MapiMessage Current
    {
        get
        {
            try
            {
                return MapiMessage.FromFile(files[position]);
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    public void Dispose()
    {
    }
}