إدارة الرسائل في ملفات PST

Contents
[ ]

الحصول على معلومات الرسائل من ملف Outlook PST

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{            
    string dataDir = RunExamples.GetDataDir_Outlook();

    // Load the Outlook file
    string path = dataDir + "PersonalStorage.pst";

    try
    {
       
        // Load the Outlook PST file
        PersonalStorage personalStorage = PersonalStorage.FromFile(path);

        // Get the Display Format of the PST file
        Console.WriteLine("Display Format: " + personalStorage.Format);

        // Get the folders and messages information
        FolderInfo folderInfo = personalStorage.RootFolder;

        // Call the recursive method to display the folder contents
        DisplayFolderContents(folderInfo, personalStorage);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);               
    }            
}

/// <summary>
/// This is a recursive method to display contents of a folder
/// </summary>
/// <param name="folderInfo"></param>
/// <param name="pst"></param>
private static void DisplayFolderContents(FolderInfo folderInfo, PersonalStorage pst)
{
    // Display the folder name
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("==================================");
    // Display information about messages inside this folder
    MessageInfoCollection messageInfoCollection = folderInfo.GetContents();
    foreach (MessageInfo messageInfo in messageInfoCollection)
    {
        Console.WriteLine("Subject: " + messageInfo.Subject);
        Console.WriteLine("Sender: " + messageInfo.SenderRepresentativeName);
        Console.WriteLine("Recipients: " + messageInfo.DisplayTo);
        Console.WriteLine("------------------------------");
    }

    // Call this method recursively for each subfolder
    if (folderInfo.HasSubFolders == true)
    {
        foreach (FolderInfo subfolderInfo in folderInfo.GetSubFolders())
        {
            DisplayFolderContents(subfolderInfo, pst);
        }
    }
}

استخراج الرسائل من ملفات PST

يوضح هذا المقال كيفية قراءة ملفات PST الخاصة بـ Microsoft Outlook واستخراج الرسائل. ثم تُحفظ الرسائل على القرص بصيغة MSG.

يوضح مقطع الشيفرة التالي كيفية استخراج الرسائل من ملف PST:

  • استخدم طريقة متكررة لتصفح جميع المجلدات (بما في ذلك المجلدات المتداخلة) واستدعِ طريقة PersonalStorage.ExtractMessage() لجلب رسائل Outlook إلى نسخة من الـ MapiMessage فئة.
  • بعد ذلك، استدعِ طريقة MapiMessage.Save() لحفظ الرسالة إما على قرص أو إلى تدفق بصيغة MSG.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{            
    // The path to the file directory.
    string dataDir = RunExamples.GetDataDir_Outlook();

    // Load the Outlook file
    string path = dataDir + "PersonalStorage.pst";

    try
    {
        // load the Outlook PST file
        PersonalStorage pst = PersonalStorage.FromFile(path);

        // get the Display Format of the PST file
        Console.WriteLine("Display Format: " + pst.Format);

        // get the folders and messages information
        FolderInfo folderInfo = pst.RootFolder;

        // Call the recursive method to extract msg files from each folder
        ExtractMsgFiles(folderInfo, pst);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }            
}

/// <summary>
/// This is a recursive method to display contents of a folder
/// </summary>
/// <param name="folderInfo"></param>
/// <param name="pst"></param>
private static void ExtractMsgFiles(FolderInfo folderInfo, PersonalStorage pst)
{
    // display the folder name
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("==================================");
    // loop through all the messages in this folder
    MessageInfoCollection messageInfoCollection = folderInfo.GetContents();
    foreach (MessageInfo messageInfo in messageInfoCollection)
    {
        Console.WriteLine("Saving message {0} ....", messageInfo.Subject);
        // get the message in MapiMessage instance
        MapiMessage message = pst.ExtractMessage(messageInfo);
        // save this message to disk in msg format
        message.Save(message.Subject.Replace(":", " ") + ".msg");
        // save this message to stream in msg format
        MemoryStream messageStream = new MemoryStream();
        message.Save(messageStream);
    }

    // Call this method recursively for each subfolder
    if (folderInfo.HasSubFolders == true)
    {
        foreach (FolderInfo subfolderInfo in folderInfo.GetSubFolders())
        {
            ExtractMsgFiles(subfolderInfo, pst);
        }
    }
}

تحديد أنماط عناصر MAPI

الـ MapiItemType تعداد يمثل نوع عنصر MAPI يمكن تحويله صراحةً إلى كائن من الفئة المقابلة المشتقة من الـ IMapiMessageItem واجهة. بهذه الطريقة يمكن للمستخدمين تجنب فحص الـ MessageClass قيمة الخاصية قبل تحويل الرسالة.

توضح عينة الشيفرة التالية كيفية تعريف نوع للعنصر المراد تحويله:

foreach (var messageInfo in folder.EnumerateMessages())
{
    var msg = pst.ExtractMessage(messageInfo);

    switch (msg.SupportedType)
    {
        // Non-supported type. MapiMessage cannot be converted to an appropriate item type.
        // Just use in MSG format.
        case MapiItemType.None:
            break;
        // An email message. Conversion isn't required.
        case MapiItemType.Message:
            break;
        // A contact item. Can be converted to MapiContact.
        case MapiItemType.Contact:
            var contact = (MapiContact)msg.ToMapiMessageItem();
            break;
        // A calendar item. Can be converted to MapiCalendar.
        case MapiItemType.Calendar:
            var calendar = (MapiCalendar)msg.ToMapiMessageItem();
            break;
        // A distribution list. Can be converted to MapiDistributionList.
        case MapiItemType.DistList:
            var dl = (MapiDistributionList)msg.ToMapiMessageItem();
            break;
        // A Journal entry. Can be converted to MapiJournal.
        case MapiItemType.Journal:
            var journal = (MapiJournal)msg.ToMapiMessageItem();
            break;
        // A StickyNote. Can be converted to MapiNote.
        case MapiItemType.Note:
            var note = (MapiNote)msg.ToMapiMessageItem();
            break;
        // A Task item. Can be converted to MapiTask.
        case MapiItemType.Task:
            var task = (MapiTask)msg.ToMapiMessageItem();
            break;
    }
}

بحث الرسائل واسترجاعها

توفر Aspose.Email الطرق المشحونة التالية لـ FolderInfo فئة لتصفية واسترجاع الرسائل:

استرجاع محتويات المجلد بتقسيم الصفحات

عند العمل مع مجلدات PST الكبيرة، قد يكون استرجاع جميع الرسائل مرة واحدة غير فعال. لتحسين الأداء والتحكم، توفر Aspose.Email لـ .NET دعم التقسيم إلى صفحات في الـ FolderInfo.GetContents طريقة. تسترجع هذه الطريقة مجموعة فرعية من الرسائل التي تطابق الاستعلام المحدد، بدءًا من فهرس معين ومحدودة بعدد. هذا يتيح لك جلب الرسائل على دفعات أصغر وقابلة للإدارة. تأخذ الطريقة المعاملات التالية:

IList<MessageInfo> FolderInfo.GetContents(MailQuery query, int startIndex, int count)
  • query — مرشح لتطبيقه على الرسائل (اختياري)

  • startIndex — الفهرس الصفري الذي يبدأ الاسترجاع منه

  • count — عدد الرسائل المراد إرجاعها

توضح عينة الشيفرة أدناه كيفية تنفيذ هذه الطريقة في مشروع:

// Load the PST file
using (var pst = PersonalStorage.FromFile(fileName))
{
    // Access a specific subfolder
    var folder = pst.RootFolder.GetSubFolder("Inbox");

    // Build a query to filter messages by sender address
    var queryBuilder = new PersonalStorageQueryBuilder();
    queryBuilder.From.Contains("report-service", true);

    // Define the page size
    int pageSize = 5;

    // Retrieve and process messages in pages
    for (int pageIndex = 0; pageIndex < 6; pageIndex++)
    {
        int startIndex = pageIndex * pageSize;

        // Get a page of messages
        var messages = folder.GetContents(queryBuilder.GetQuery(), startIndex, pageSize);

        foreach (MessageInfo messageInfo in messages)
        {
            // Output basic info about each message
            Console.WriteLine($"Subject: {messageInfo.Subject}, Sender: {messageInfo.SenderRepresentativeName}");
        }
    }
}

حفظ الرسائل مباشرةً من PST إلى تدفق

لحفظ الرسائل من ملف PST مباشرةً إلى تدفق، دون استخراج MsgInfo للرسائل، استخدم طريقة SaveMessageToStream(). يعرض مقطع الشيفرة التالي كيفية حفظ الرسائل مباشرةً من PST إلى تدفق.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the file directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load the Outlook file
string path = dataDir + "PersonalStorage.pst";

// Save message to MemoryStream
using (PersonalStorage personalStorage = PersonalStorage.FromFile(path))
{
    FolderInfo inbox = personalStorage.RootFolder.GetSubFolder("Inbox");
    foreach (MessageInfo messageInfo in inbox.EnumerateMessages())
    {
        using (MemoryStream memeorystream = new MemoryStream())
        {
            personalStorage.SaveMessageToStream(messageInfo.EntryIdString, memeorystream);
        }
    }
}

// Save message to file
using (PersonalStorage pst = PersonalStorage.FromFile(path))
{
    FolderInfo inbox = pst.RootFolder.GetSubFolder("Inbox");
    foreach (MessageInfo messageInfo in inbox.EnumerateMessages())
    {
        using (FileStream fs = File.OpenWrite(messageInfo.Subject + ".msg"))
        {
            pst.SaveMessageToStream(messageInfo.EntryIdString, fs);
        }
    }
}

using (PersonalStorage pst = PersonalStorage.FromFile(path))
{
    FolderInfo inbox = pst.RootFolder.GetSubFolder("Inbox");
    
    // To enumerate entryId of messages you may use FolderInfo.EnumerateMessagesEntryId() method:
    foreach (string entryId in inbox.EnumerateMessagesEntryId())
    {
        using (MemoryStream ms = new MemoryStream())
        {
            pst.SaveMessageToStream(entryId, ms);
        }
    }
}            

استخراج عدد محدد من الرسائل

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
FolderInfo inbox = personalStorage.RootFolder.GetSubFolder("Inbox");

// Extracts messages starting from 10th index top and extract total 100 messages
MessageInfoCollection messages = inbox.GetContents(10, 100);

الحصول على عدد العناصر الإجمالي من PST

توفر Aspose.Email الـ GetTotalItemsCount() طريقة الـ PersonalStorage.Store خاصية. تُعيد العدد الإجمالي لعناصر الرسائل الموجودة في PST.

يوضح المثال البرمجي التالي كيفية استرجاع العدد الكلي للعناصر (رسائل، مواعيد، جهات اتصال، إلخ) المخزنة داخل ملف PST:

using (var pst = PersonalStorage.FromFile("my.pst", false))
{
    var count = pst.Store.GetTotalItemsCount();
}

استخراج المرفقات دون استخراج الرسالة بالكامل

يمكن استخدام واجهة برمجة تطبيقات Aspose.Email لاستخراج المرفقات من رسائل PST دون استخراج الرسالة بالكامل أولاً. الـ ExtractAttachments طريقة من PersonalStorage يمكن استخدامه للقيام بذلك. يوضح مقطع الشيفرة التالي كيفية استخراج المرفقات دون استخراج رسالة كاملة.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string dataDir = RunExamples.GetDataDir_Outlook();

using (PersonalStorage personalstorage = PersonalStorage.FromFile(dataDir + "Outlook.pst"))
{
    FolderInfo folder = personalstorage.RootFolder.GetSubFolder("Inbox");

    foreach (var messageInfo in folder.EnumerateMessagesEntryId())
    {
        MapiAttachmentCollection attachments = personalstorage.ExtractAttachments(messageInfo);

        if (attachments.Count != 0)
        {
            foreach (var attachment in attachments)
            {
                if (!string.IsNullOrEmpty(attachment.LongFileName))
                {
                    if (attachment.LongFileName.Contains(".msg"))
                    {
                        continue;
                    }
                    else
                    {
                        attachment.Save(dataDir + @"\Attachments\" + attachment.LongFileName);
                    }
                }
            }
        }
    }
}

استخراج مستلمي الرسالة من ملفات PST

يمكن استخراج مستلمي الرسالة من ملفات PST باستخدام معرف إدخال الرسالة. هذه الميزة متوفرة في الـ PersonalStorage فئة. توضح عينات الشيفرة أدناه كيفية استخراج مستلمي الرسالة:

بواسطة EntryD (باستخدام الـ ExtractRecipients(string entryId) طريقة الـ PersonalStorage فئة)

using (var pst = PersonalStorage.FromFile(fileName))
{  
    // Recipients are extracted using the entry ID
    var recipients = pst.ExtractRecipients("AAAAADzSMygQQFJOkKwVhb8v5EUkASAA");
}

من MessageInfo (باستخدام الـ MapiRecipientCollection ExtractRecipients(MessageInfo messageInfo) طريقة)

using (var pst = PersonalStorage.FromFile(fileName))
{  
    // The "Inbox" folder is obtained
    var folder = pst.RootFolder.GetSubfolder("Inbox");

    // Each message in the "Inbox" folder is iterated
    foreach (var messageInfo in folder.EnumerateMessages())
    {
        // Recipients are extracted from each message
        var recipients = pst.ExtractRecipients(messageInfo);
    }
}

بحث الرسائل والمجلدات

البحث حسب المعيار

ملفات التخزين الشخصي (PST) يمكن أن تحتوي على كمية هائلة من البيانات. البحث عن البيانات التي تلبي معيارًا محددًا في مثل هذه الملفات الكبيرة يتطلب تضمين نقاط فحص متعددة في الشيفرة لتصفية المعلومات. مع الـ PersonalStorageQueryBuilder فئة، يتيح Aspose.Email إمكانية البحث عن سجلات محددة في PST بناءً على معيار بحث محدد. يمكن البحث في PST عن الرسائل وفقًا لمعلمات البحث مثل المرسل، المستقبل، الموضوع، أهمية الرسالة، وجود مرفقات، حجم الرسالة، وحتى معرف الرسالة. الـ PersonalStorageQueryBuilder يمكن أيضًا استخدامها للبحث عن المجلدات الفرعية.

البحث عن الرسائل والمجلدات في PST

يوضح مقتطف الكود التالي كيفية استخدام PersonalStorageQueryBuilder فئة للبحث عن المحتويات في PST بناءً على معايير بحث مختلفة. على سبيل المثال، تُظهر البحث في PST بناءً على:

  • أهمية الرسالة.
  • فئة الرسالة.
  • وجود مرفقات.
  • حجم الرسالة.
  • رسائل غير مقروءة.
  • رسائل غير مقروءة مع مرفقات، و
  • المجلدات ذات اسم المجلد الفرعي المحدد.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

using (PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir + "Outlook.pst"))
{
    FolderInfo folder = personalStorage.RootFolder.GetSubFolder("Inbox");
    PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();

    // High importance messages
    builder.Importance.Equals((int)MapiImportance.High);
    MessageInfoCollection messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("Messages with High Imp:" + messages.Count);

    builder = new PersonalStorageQueryBuilder();
    builder.MessageClass.Equals("IPM.Note");
    messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("Messages with IPM.Note:" + messages.Count);

    builder = new PersonalStorageQueryBuilder();
    // Messages with attachments AND high importance
    builder.Importance.Equals((int)MapiImportance.High);
    builder.HasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
    messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("Messages with atts: " + messages.Count);

    builder = new PersonalStorageQueryBuilder();
    // Messages with size > 15 KB
    builder.MessageSize.Greater(15000);
    messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("messags size > 15Kb:" + messages.Count);

    builder = new PersonalStorageQueryBuilder();
    // Unread messages
    builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
    messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("Unread:" + messages.Count);

    builder = new PersonalStorageQueryBuilder();
    // Unread messages with attachments
    builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
    builder.HasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
    messages = folder.GetContents(builder.GetQuery());
    Console.WriteLine("Unread msgs with atts: " + messages.Count);

    // Folder with name of 'SubInbox'
    builder = new PersonalStorageQueryBuilder();
    builder.FolderName.Equals("SubInbox");
    FolderInfoCollection folders = folder.GetSubFolders(builder.GetQuery());
    Console.WriteLine("Folder having subfolder: " + folders.Count);

    builder = new PersonalStorageQueryBuilder();
    // Folders with subfolders
    builder.HasSubfolders();
    folders = folder.GetSubFolders(builder.GetQuery());
    Console.WriteLine(folders.Count);
}

بحث مع تجاهل حالة الأحرف

يعرض المقتطف البرمجي التالي كيفية البحث عن سلسلة نصية في PST باستخدام معامل تجاهل الحالة.

using (PersonalStorage personalStorage = PersonalStorage.Create("CaseSensitivity.pst", FileFormatVersion.Unicode))
{
	FolderInfo folderinfo = personalStorage.CreatePredefinedFolder("Inbox", StandardIpmFolder.Inbox);
	folderinfo.AddMessage(MapiMessage.FromMailMessage(MailMessage.Load("Sample.eml")));
	PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
	// IgnoreCase is True
	builder.From.Contains("automated", true);
	MailQuery query = builder.GetQuery();
	MessageInfoCollection coll = folderinfo.GetContents(query);
	Console.WriteLine(coll.Count);
}

بحث عن مواضيع الرسائل باستخدام كلمات مفتاحية متعددة

يمكنك استخدام MailQueryBuilder.Or طريقة للعثور على رسائل ذات موضوع يحتوي على كلمة واحدة على الأقل من الكلمات المحددة كما هو موضح أدناه:

var builder1 = new PersonalStorageQueryBuilder();
builder1.Subject.Contains("Review"); // 'Review' is key word for the search

var builder2 = new PersonalStorageQueryBuilder();
builder2.Subject.Contains("Error"); // 'Error' is also key word for the search

var queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.Or(builder1.GetQuery(), builder2.GetQuery()); // message subjects must contain 'Review' or 'Error' words

using (var storage = PersonalStorage.FromFile("example.pst"))
{
    var folderInfo = storage.RootFolder.GetSubFolder("Inbox");
    var messageInfos = folderInfo.GetContents(queryBuilder.GetQuery());

    foreach (var messageInfo in messageInfos)
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

معالجة الرسائل

نقل العناصر إلى مجلدات أخرى

يتيح Aspose.Email إمكانية نقل العناصر من مجلد المصدر إلى مجلد آخر في نفس ملف التخزين الشخصي (PST). وهذا يشمل:

  • نقل مجلد محدد إلى مجلد أب جديد.
  • نقل رسائل محددة إلى مجلد جديد.
  • نقل المحتويات إلى مجلد جديد.
  • نقل المجلدات الفرعية إلى مجلد أب جديد.

يعرض المقتطف البرمجي التالي كيفية نقل العناصر مثل الرسائل والمجلدات من مجلد مصدر إلى مجلد آخر في نفس ملف PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET

using(PersonalStorage personalStorage = PersonalStorage.FromFile("test.pst"))
{
    FolderInfo inbox = personalStorage.GetPredefinedFolder(StandardIpmFolder.Inbox);
    FolderInfo deleted = personalStorage.GetPredefinedFolder(StandardIpmFolder.DeletedItems);
    FolderInfo subfolder = inbox.GetSubFolder("Subfolder");

    // Move folder and message to the Deleted Items
    personalStorage.MoveItem(subfolder, deleted);
    MessageInfoCollection contents = subfolder.GetContents();
    personalStorage.MoveItem(contents[0], deleted);

    // Move all inbox subfolders and subfolder contents to the Deleted Items
    inbox.MoveSubfolders(deleted);
    subfolder.MoveContents(deleted);
}

تحديث خصائص الرسالة

في بعض الأحيان يلزم تحديث بعض خصائص الرسائل مثل تغيير الموضوع، وضع علامة على أهمية الرسالة وما إلى ذلك. يمكن تحقيق تحديث رسالة في ملف PST مع هذه التغييرات في خصائص الرسالة باستخدام FolderInfo.ChangeMessages طريقة. توضح هذه المقالة كيفية تحديث الرسائل دفعة واحدة في ملف PST لتغييرات الخصائص. يوضح مثال الكود التالي كيفية تحديث خصائص الرسائل في وضع الدفعة لعدة رسائل في ملف PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook() + "Sub.pst";

// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir);
            
// Get Requierd Subfolder 
FolderInfo inbox = personalStorage.RootFolder.GetSubFolder("Inbox");

// find messages having From = "someuser@domain.com"
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.From.Contains("someuser@domain.com");

// Get Contents from Query
MessageInfoCollection messages = inbox.GetContents(queryBuilder.GetQuery());

// Save (MessageInfo,EntryIdString) in List
IList<string> changeList = new List<string>();
foreach (MessageInfo messageInfo in messages)
{
    changeList.Add(messageInfo.EntryIdString);
}

// Compose the new properties
MapiPropertyCollection updatedProperties = new MapiPropertyCollection();
updatedProperties.Add(MapiPropertyTag.PR_SUBJECT_W, new MapiProperty(MapiPropertyTag.PR_SUBJECT_W, Encoding.Unicode.GetBytes("New Subject")));
updatedProperties.Add(MapiPropertyTag.PR_IMPORTANCE, new MapiProperty(MapiPropertyTag.PR_IMPORTANCE, BitConverter.GetBytes((long)2)));

// update messages having From = "someuser@domain.com" with new properties
inbox.ChangeMessages(changeList, updatedProperties);

تحديث الخصائص المخصصة

أحيانًا يكون من الضروري وضع علامة على العناصر التي تمت معالجتها داخل ملف PST. تتيح Aspose.Email API تحقيق ذلك باستخدام MapiProperty و MapiNamedProperty. الطرق التالية مفيدة لتحقيق ذلك.

  • ctor MapiNamedProperty(long propertyTag, string nameIdentifier, Guid propertyGuid, byte[] propertyValue)
  • ctor MapiNamedProperty(long propertyTag, long nameIdentifier, Guid propertyGuid, byte[] propertyValue)
  • FolderInfo.ChangeMessages(MapiPropertyCollection updatedProperties) - changes all messages in folder
  • PersonalStorage.ChangeMessage(string entryId, MapiPropertyCollection updatedProperties) - changes message properties
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET

public static void Run()
{
	// Load the Outlook file
	string dataDir = RunExamples.GetDataDir_Outlook() + "Sub.pst";
	using (PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir))
	{
		FolderInfo testFolder = personalStorage.RootFolder.GetSubFolder("Inbox");

		// Create the collection of message properties for adding or updating
		MapiPropertyCollection newProperties = new MapiPropertyCollection();

		// Normal,  Custom and PidLidLogFlags named  property
		MapiProperty property = new MapiProperty(MapiPropertyTag.PR_ORG_EMAIL_ADDR_W,Encoding.Unicode.GetBytes("test_address@org.com"));
		MapiProperty namedProperty1 = new MapiNamedProperty(GenerateNamedPropertyTag(0, MapiPropertyType.PT_LONG),"ITEM_ID",Guid.NewGuid(),BitConverter.GetBytes(123));
		MapiProperty namedProperty2 = new MapiNamedProperty(GenerateNamedPropertyTag(1, MapiPropertyType.PT_LONG),0x0000870C,new Guid("0006200A-0000-0000-C000-000000000046"),BitConverter.GetBytes(0));
		newProperties.Add(namedProperty1.Tag, namedProperty1);
		newProperties.Add(namedProperty2.Tag, namedProperty2);
		newProperties.Add(property.Tag, property);
		testFolder.ChangeMessages(testFolder.EnumerateMessagesEntryId(), newProperties);
	}
}

private static long GenerateNamedPropertyTag(long index, MapiPropertyType dataType)
{
	return (((0x8000 | index) << 16) | (long)dataType) & 0x00000000FFFFFFFF;
}

حذف الرسائل

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

  1. إنشاء مثيل من الـ FolderInfo الفئة وتحميلها بمحتويات المجلد الفرعي للمرسلة.
  2. احذف الرسائل من مجلد المرسلة عن طريق استدعاء FolderInfo.DeleteChildItem() طريقة وتمرير الـ MessageInfo.EntryId كمعامل. يوضح المقتطف البرمجي التالي كيفية حذف الرسائل من مجلد فرعي للرسائل المرسلة في ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook() + "Sub.pst";

// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir);

// Get the Sent items folder
FolderInfo folderInfo = personalStorage.GetPredefinedFolder(StandardIpmFolder.SentItems);

MessageInfoCollection msgInfoColl = folderInfo.GetContents();
foreach (MessageInfo msgInfo in msgInfoColl)
{
    Console.WriteLine(msgInfo.Subject + ": " + msgInfo.EntryIdString);
    if (msgInfo.Subject.Equals("some delete condition") == true)
    {
        // Delete this item
        folderInfo.DeleteChildItem(msgInfo.EntryId);
        Console.WriteLine("Deleted this message");
    }
}

حذف المجلدات

يمكنك حذف مجلد PST بنقله إلى مجلد العناصر المحذوفة.

using (PersonalStorage pst = PersonalStorage.FromFile(@"test.pst"))
{
    FolderInfo deletedItemsFolder = pst.GetPredefinedFolder(StandardIpmFolder.DeletedItems);
    FolderInfo emptyFolder = pst.RootFolder.GetSubFolder("Empty folder");
	  FolderInfo someFolder = pst.RootFolder.GetSubFolder("Some folder");
    pst.MoveItem(emptyFolder, deletedItemsFolder);
	  pst.MoveItem(someFolder, deletedItemsFolder);
}

ميزة هذه الطريقة هي أن المجلد المحذوف يمكن استعادته بسهولة.

FolderInfo someFolder = deletedItemsFolder.GetSubFolder("Some folder");
pst.MoveItem(someFolder, pst.RootFolder);

يمكنك أيضًا إزالة مجلد بشكل دائم من مجلد العناصر المحذوفة إذا لزم الأمر.

deletedItemsFolder.DeleteChildItem(emptyFolder.EntryId);

الـ DeleteChildItem() يمكن استخدام الطريقة لأي مجلدات إذا رغبت في حذف مجلد فرعي على الفور وبشكل دائم، متجاوزًا مجلد العناصر المحذوفة.

FolderInfo someFolder = pst.RootFolder.GetSubFolder("Some folder");
pst.RootFolder.DeleteChildItem(someFolder.EntryId);

حذف العناصر من PST

احذف العناصر (المجلدات أو الرسائل) من جدول التخزين الشخصي (PST) باستخدام entryId الفريد المرتبط بالعنصر عن طريق استدعاء طريقة DeleteItem(string entryId) الخاصة بـ PersonalStorage فئة.

يمكن استخدام شريحة الشيفرة التالية لاستدعاء طريقة DeleteItem وتمرير entryId كمعامل:

var pst = PersonalStorage.FromFile("sample.pst");

// ...

pst.DeleteItem(entryId);

// ...

يرجى ملاحظة:

  • ستقوم هذه الطريقة بحذف العنصر نهائيًا من PST ولا يمكن التراجع عنها. توخَ الحذر عند استخدام هذه الطريقة لتجنب فقدان البيانات عن طريق الخطأ.
  • حسب المعايير القياسية، تأكد من أن entryId صالح ويتطابق مع عنصر موجود داخل PST.
  • إلا سيتم رمي استثناء. من المستحسن وجود نسخة احتياطية من ملف PST أو تنفيذ إجراءات مناسبة لاستعادة العناصر المحذوفة إذا لزم الأمر.

حذف جماعي

يمكن استخدام Aspose.Email API لحذف العناصر دفعة واحدة من ملف PST. يتم ذلك باستخدام الـ DeleteChildItems() طريقة تقبل قائمة من عناصر معرف الإدخال (Entry ID) التي تشير إلى العناصر التي سيتم حذفها. يوضح المقتطف البرمجي التالي كيفية حذف العناصر دفعة واحدة من ملف PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook() + @"Sub.pst";
using (PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir))
{
    // Get Inbox SubFolder from Outlook file
    FolderInfo inbox = personalStorage.RootFolder.GetSubFolder("Inbox");

    // Create instance of PersonalStorageQueryBuilder
    PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();

    queryBuilder.From.Contains("someuser@domain.com");
    MessageInfoCollection messages = inbox.GetContents(queryBuilder.GetQuery());
    IList<string> deleteList = new List<string>();
    foreach (MessageInfo messageInfo in messages)
    {
        deleteList.Add(messageInfo.EntryIdString);
    }

    // delete messages having From = "someuser@domain.com"
    inbox.DeleteChildItems(deleteList);
}

استعادة العناصر المحذوفة ناعماً من ملفات PST و OST

يوفر Aspose.Email for .NET طريقة لاستعادة العناصر المحذوفة ناعماً من ملفات PST و OST. يتم تنفيذ هذه الوظيفة عبر الـ PersonalStorage فئة، التي تشمل الـ FindAndExtractSoftDeletedItems طريقة. تتيح لك هذه الطريقة تحديد موقع العناصر التي تم حذفها ناعماً واستعادتها، مما يمكنك من استرجاع البيانات المهمة التي قد تُفقد. تُحفظ العناصر المستعادة في المجلدات الخاصة بها كـ .msg الملفات، مع ضمان الحفاظ على بنية المجلد الأصلية. توضح عينة الشيفرة أدناه كيفية تنفيذ هذه الميزة في مشروعك:

using (var pst = PersonalStorage.FromFile(fileName))
{
    // Soft deleted items are found and extracted
    var entries = pst.FindAndExtractSoftDeletedItems();

    // The recovered items are iterated through
    for (var index = 0; index < entries.Count; index++)
    {
        // Folder information is obtained by ID
        var folderInfo = pst.GetFolderById(entries[index].FolderId);

        // A directory for the folder is created if it doesn't exist
        if (!Directory.Exists(folderInfo.DisplayName))
        {
            Directory.CreateDirectory(Path.Combine(path, folderInfo.DisplayName));
        }
        
        // The restored item is obtained
        var msg = entries[index].Item;
        
        // The restored item is saved as a .msg file
        msg.Save(Path.Combine(path, folderInfo.DisplayName, $"{index}.msg"));
    }
}

تعداد الرسائل المحذوفة ناعماً في ملفات PST

الرسائل المحذوفة ناعماً في ملف PST هي عناصر تم حذفها مرتين — أولاً تم نقلها إلى عناصر محذوفة، ثم أزيلت مرة أخرى. هذه الرسائل ليست محذوفة نهائيًا ويمكن الوصول إليها برمجيًا. يدعم Aspose.Email for .NET استرجاع هذه الرسائل المحذوفة ناعماً للمراجعة أو الاستعادة.

لتعداد واستعادة العناصر التي تم حذفها ناعماً (محذوفة مرتين) في ملفات PST، استخدم الـ FindAndEnumerateSoftDeletedItems() طريقة. تسترجع هذه الطريقة قائمة قابلة للتعداد من مثل هذه العناصر، كل منها يتضمن الرسالة ومعرف المجلد الذي تم حذفها منه.

تظهر عينة الشيفرة التالية كيفية تعداد واستعادة رسائل البريد التي تم حذفها مرتين. تُعيد الـ RestoredItemEntry فئة تمثل إدخالًا لعنصر محذوف ناعماً مستعاد من ملف PST. تحتوي الفئة على الخصائص التالية:

// Load the PST file
using (var pst = PersonalStorage.FromFile("archive.pst"))
{
    // Enumerate soft-deleted items
    foreach (var entry in pst.FindAndEnumerateSoftDeletedItems())
    {
        var message = entry.Item;
        var folderId = entry.FolderId;

        Console.WriteLine($"Subject: {message.Subject}");
        Console.WriteLine($"Deleted from Folder ID: {folderId}");
        Console.WriteLine("-----------------------------------");
    }
}

تقسيم ملفات PST

تقسيم إلى ملفات PST متعددة

توفر Aspose.Email API القدرة على تقسيم ملف PST واحد إلى عدة ملفات PST بحجم الملف المطلوب.

تعرض عينة الشيفرة أدناه عملية تقسيم الملف:

  1. أولاً، يستخدم الـ FromFile طريقة الـ PersonalStorage الفئة لتحديد اسم الملف.

  2. بعد ذلك، يستدعي الـ StorageProcessedEventHandler المندوب لمعالجة حدث StorageProcessed.

  3. يوفر StorageProcessingEventArgs بيانات لحدث PersonalStorage.StorageProcessing. الخاص به StorageProcessingEventArgs.FileName الخاصية تسمح لك باسترجاع اسم ملف PST. لـ MergeWith طريقة ستكون اسم ملف PST الحالي الذي سيتم دمجه مع الرئيسي، ولـ SplitInto طريقة ستكون اسم الجزء الحالي.

  4. أخيرًا، SplitInto(long chunkSize, string partFileNamePrefix, string path) طريقة التحميل الزائد ستطلق عملية تقسيم تخزين PST إلى أجزاء أصغر. تستقبل المعلمات التالية:

  • chunkSize: الحجم التقريبي لكل جزء بالبايت.
  • partFileNamePrefix: البادئة التي سيتم إضافتها إلى اسم كل جزء من PST. إذا تم توفيرها، ستُضاف البادئة إلى بداية كل اسم ملف. إذا لم تُوفر (null أو فارغ)، سيُنشأ أجزاء PST بدون بادئة.
  • path: مسار المجلد حيث سيتم إنشاء الأجزاء.

اسم الملف لكل جزء يتبع القالب: {prefix}part{number}.pst، حيث يمثل {prefix} بادئة اسم الملف (إذا تم توفيرها)، و{number} يمثل رقم الجزء.

var pst = PersonalStorage.FromFile("sample.pst");

// ...

pst.StorageProcessing += (sender, args) =>
{
    Console.WriteLine("Storage processing event raised for file: " + args.FileName);
};

// ...

pst.SplitInto(5000000, "prefix_", outputFolderPath);

تقسيم PST بناءً على معيار محدد

تظهر لك شريحة الشيفرة التالية كيفية تقسيم ملف PST بناءً على معيار محدد.

دمج ملفات PST

دمج في ملف PST واحد

يمكنه أيضًا دمج عدة ملفات PST في ملف PST واحد. يمكن تتبع عمليات تقسيم ودمج ملفات PST بإضافة أحداث إلى هذه العمليات.

يوضح مقطع الشيفرة التالي كيفية دمجها في ملف PST واحد.

دمج المجلدات من PST آخر

يوضح مقطع الشيفرة التالي كيفية دمج المجلدات من PST آخر.