خواندن فایل‌های PST و استخراج اطلاعات

خواندن فایل‌های PST و بازیابی اطلاعات

Aspose.Email برای .NET یک API برای خواندن فایل‌های PST مایکروسافت اوتلوک فراهم می‌کند. می‌توانید یک فایل PST را از دیسک یا استریم به یک نمونهٔ PersonalStorage کلاس و اطلاعات مربوط به محتویات آن، مانند پوشه‌ها، زیرپوشه‌ها و پیام‌ها را به‌دست می‌آورد. API همچنین قابلیت افزودن پوشه‌های جستجو را هنگام عبور از پوشه‌های PST برای پیدا کردن پیام‌ها فراهم می‌کند.

بارگیری فایل PST

یک فایل PST اوتلوک می‌تواند در یک نمونهٔ PersonalStorage کلاس. کد زیر نشان می‌دهد چگونه فایل PST را بارگذاری کنید.

// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.FromFile(dataDir + @"PersonalStorage.pst");

نمایش اطلاعات پوشه‌ها

پس از بارگذاری فایل PST در PersonalStorage کلاس، می‌توانید اطلاعات نام نمایش فایل، پوشه ریشه، زیرپوشه‌ها و تعداد پیام‌ها را بدست آورید. قطعه کد زیر نشان می‌دهد چگونه نام فایل PST، پوشه‌ها و تعداد پیام‌ها در پوشه‌ها را نمایش دهید.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
string dst = dataDir + "PersonalStorage.pst";

// load PST file
PersonalStorage personalStorage = PersonalStorage.FromFile(dst);

// Get the folders information
FolderInfoCollection folderInfoCollection = personalStorage.RootFolder.GetSubFolders();

// Browse through each folder to display folder name and number of messages
foreach (FolderInfo folderInfo in folderInfoCollection)
{
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("Total items: " + folderInfo.ContentCount);
    Console.WriteLine("Total unread items: " + folderInfo.ContentUnreadCount);
    Console.WriteLine("-----------------------------------");
}

دریافت فقط پوشه‌های تعریف‌شده توسط کاربر

فایل‌های PST/OST ممکن است شامل پوشه‌هایی باشند که توسط کاربر ایجاد شده‌اند. Aspose.Email امکان دسترسی به فقط پوشه‌های تعریف‌شده توسط کاربر را با استفاده از PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser خاصیت. می‌توانید مقدار PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser خاصیت به true برای دریافت فقط پوشه‌های تعریف‌شده توسط کاربر. قطعه کد زیر استفاده از PersonalStorageQueryBuilder.OnlyFoldersCreatedByUser برای دریافت پوشه‌های تعریف‌شده توسط کاربر.

using (PersonalStorage pst = PersonalStorage.FromFile(dataDir + "Outlook.pst"))
{
    PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
    queryBuilder.OnlyFoldersCreatedByUser.Equals(true);

    FolderInfoCollection subfolders = pst.RootFolder.GetSubFolders(queryBuilder.GetQuery());
    foreach (FolderInfo folder in subfolders)
    {
        Console.WriteLine(folder.DisplayName);
    }
}

بررسی اینکه آیا پوشه پیش‌تعریف شده است

هنگام باز کردن و بررسی پوشه‌های موجود در یک فایل PST (Personal Storage Table)، می‌توانید بررسی کنید که آیا هر پوشه از نوع پوشه پیش‌تعریف‌شده است یا زیرپوشه‌ای از یک پوشه پیش‌تعریف‌شده و اطلاعات مربوط به هر پوشه را به دست آورید.

این FolderInfo.GetPredefinedType(bool getForTopLevelParent) متد اجازه می‌دهد بررسی کنید آیا پوشه از StandardIpmFolder. اگر پارامتر getForTopLevelParent true باشد، متد یک مقدار را برمی‌گرداند StandardIpmFolder مقدار enum برای پوشه والد سطح بالا. این تعیین می‌کند که آیا پوشه فعلی زیرپوشه یک پوشه پیش‌تعریف شده است یا نه. اگر پارامتر getForTopLevelParent false باشد، یک مقدار را برمی‌گرداند StandardIpmFolder مقدار enum برای پوشه فعلی.

نمونه کد زیر نشان می‌دهد چگونه این ویژگی را در پروژه خود پیاده‌سازی کنید:

using (PersonalStorage pst = PersonalStorage.FromFile("my.pst"))
{
    FolderInfoCollection folders = pst.RootFolder.GetSubFolders();

    foreach (FolderInfo folder in folders)
    {
        Console.WriteLine($"Folder: {folder.DisplayName}");
        Console.WriteLine($"Is predefined: {folder.GetPredefinedType(false) != StandardIpmFolder.Unspecified}");
        Console.WriteLine("-----------------------------------");
    }
}

بازیابی اطلاعات پوشه والد

قطعه کد زیر نحوه بازیابی اطلاعات پوشه والد را از MessageInfo.


using (PersonalStorage pst = PersonalStorage.FromFile(fileName))
{
	foreach (FolderInfo folder in pst.RootFolder.GetSubFolders())
	{
		foreach (MessageInfo msg in folder.EnumerateMessages())
		{
			FolderInfo folderInfo = pst.GetParentFolder(msg.EntryId);
		}
	}
}

بازیابی زیرپوشه بر اساس مسیر

این FolderInfo.GetSubFolder(string name, bool ignoreCase, bool handlePathSeparator) بارگذاری (overload) متد به شما امکان می‌دهد تا زیرپوشه‌ای با نام مشخص‌شده را از پوشهٔ PST فعلی بازیابی کنید.

متد پارامترهای زیر را می‌گیرد:

  • name - نام زیرپوشه‌ای که باید بازیابی شود را مشخص می‌کند.
  • ignoreCase - تعیین می‌کند جستجو برای نام زیرپوشه حساس به حروف بزرگ و کوچک باشد یا نه. اگر به true تنظیم شود، جستجو حساس به حروف نخواهد بود، در غیر اینصورت حساس خواهد بود.
  • handlePathSeparator - مشخص می‌کند که آیا نام پوشهٔ مشخص‌شده باید به عنوان مسیر در نظر گرفته شود اگر شامل بک‌اسلش باشد. اگر به true تنظیم شود، متد نام پوشه را به‌عنوان مسیر تفسیر می‌کند و سعی می‌کند به زیرپوشه با استفاده از مسیر دسترسی پیدا کند. اگر به false تنظیم شود، متد نام پوشه را به‌عنوان یک نام ساده در نظر می‌گیرد و به‌دنبال زیرپوشه‌ای با تطبیق دقیق نام می‌گردد.

نمونه کد زیر نشان می‌دهد که چگونه این متد را در پروژهٔ خود پیاده‌سازی کنید:

var folder = pst.RootFolder.GetSubFolder(@"Inbox\Reports\Jan", true, true);

در این نمونه، متد یک پوشه به نام ‘Jan’ که در Inbox\Reports\ مسیر نسبی به پوشه ریشه.

خوراک‌های RSS و پوشه‌های جستجوپذیر

پوشه استاندارد RSS Feeds در PersonalStorage

Aspose.Email امکان دریافت مرجعی به پوشه پیش‌تعریف‌شده‌ای که RSS feeds را نگه می‌دارد را فراهم می‌کند. این می‌تواند مفید باشد اگر بخواهید به‌صورت برنامه‌ای به RSS feeds ذخیره شده در فایل PST اوتلوک دسترسی داشته باشید و آنها را مدیریت کنید. مقدار RssFeeds را به StandardIpmFolder enum.

نمونه کد زیر نشان می‌دهد چگونه یک پوشه RSS Feeds دریافت کنید.

using (var pst = PersonalStorage.FromFile("my.pst", false))
{
    var rssFolder = pst.GetPredefinedFolder(StandardIpmFolder.RssFeeds);
}

برای افزودن یک پوشه RSS Feeds، از قطعه کد زیر استفاده کنید:

using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
    var rssFolder = pst.CreatePredefinedFolder("RSS Feeds", StandardIpmFolder.RssFeeds);
}

تجزیه و تحلیل پوشه‌های قابل جستجو

یک PST/OST ممکن است شامل پوشه‌های قابل جستجو علاوه بر نوع معمولی پوشه‌ها باشد. Aspose.Email فراهم می‌کند FolderKind enumerator برای مشخص کردن پیام‌ها از چنین پوشه‌های جستجو با EnumerateFolders و GetSubFolders متدها. قطعه کد زیر نشان می‌دهد چگونه پوشه‌های قابل جستجو را تجزیه کنید.

using (PersonalStorage pst = PersonalStorage.FromFile("my.pst"))
        {
            FolderInfoCollection folders = pst.RootFolder.GetSubFolders(FolderKind.Search | FolderKind.Normal);

            // Browse through each folder to display folder name and number of messages
            foreach (FolderInfo folder in folders)
            {
                Console.WriteLine($"Folder: {folder.DisplayName}");

                FolderInfoCollection subFolders = folder.GetSubFolders(FolderKind.Search | FolderKind.Normal);
                foreach (FolderInfo subFolder in subFolders)
                {
                    Console.WriteLine($"Sub-folder: {subFolder.DisplayName}");
                }
            }
        }

API پیمایش فایل PST

API مرور امکان استخراج تمام آیتم‌های PST را تا حد امکان، بدون پرتاب استثناها، حتی اگر برخی داده‌های فایل اصلی خراب باشند، فراهم می‌کند. مراحل زیر نشان می‌دهند چگونه از این API استفاده شود.

استفاده کنید PersonalStorage سازنده و Load متد به‌جای متد FromFile.

سازنده امکان تعریف یک متد callback را می‌دهد.

using (var currentPst = new PersonalStorage((exception, itemId) => { /* Exception handling  code. */ }))

استثناهای بارگذاری و مرور از طریق متد callback در دسترس خواهند بود.

این Load متد در صورتی که فایل با موفقیت بارگذاری شده باشد و ادامه مرور ممکن باشد، ’true’ برمی‌گرداند. اگر فایل خراب باشد و مرور امکان‌پذیر نباشد، ‘false’ برگردانده می‌شود.

if (currentPst.Load(inputStream))

این امکان را می‌دهد تا حتی فایل‌های PST خراب را بدون پرتاب استثناء باز کرده و عبور کنید. استثناء‌ها و آیتم‌های خراب توسط متد فراخوانی‌شده مدیریت می‌شوند.

using (PersonalStorage pst = new PersonalStorage((exception, itemId) => { /* Exception handling  code. */ }))
{
    if (pst.Load(@"test.pst"))
    {
        GetAllMessages(pst, pst.RootFolder);
    }
}

private static void GetAllMessages(PersonalStorage pst, FolderInfo folder)
{
    foreach (var messageEntryId in folder.EnumerateMessagesEntryId())
    {
        MapiMessage message = pst.ExtractMessage(messageEntryId);
    }
    foreach (var subFolder in folder.GetSubFolders())
    {
        GetAllMessages(pst, subFolder);
    }
}

دریافت رنگ دسته‌های آیتم از فایل‌های PST

Aspose.Email به کاربران اجازه می‌دهد اطلاعات دسته‌ها، از جمله نام‌ها و رنگ‌ها، را از فایل‌های PST استخراج کنند. داده‌های دسته می‌توانند استخراج و با آیتم‌های منفرد PST مطابقت داده شوند. از اعضای API زیر استفاده کنید:

  • OutlookCategoryColor enum - رنگ مرتبط با یک دسته را نشان می‌دهد.
  • PstItemCategory کلاس - ویژگی‌هایی برای نام دسته و رنگ ارائه می‌دهد.
  • GetCategories متد - فهرستی از دسته‌ها با نام‌ها و رنگ‌هایشان را بازیابی می‌کند.

نمونه‌های کد زیر نحوه دریافت تمام دسته‌های موجود از یک فایل PST و مطابقت آن‌ها با یک پیام ایمیل خاص را نشان می‌دهند.

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

using (var pst = PersonalStorage.FromFile("mailbox.pst"))
{
   var categories = pst.GetCategories();
   
   foreach(var category in categories)
   {
       Console.WriteLine(category);
   }
}

مطابقت نام دسته با رنگ آن

using (var pst = PersonalStorage.FromFile("mailbox.pst"))
{
    // Get all categories from the PST
    var availableCategories = pst.GetCategories();
    
    // Extract a message from the PST and retrieve the list of category names for the message
    var messageCategoryList = FollowUpManager.GetCategories(pst.ExtractMessage(messageInfo));
    
    // Iterate through each category in the message and match it with the PST category list
    foreach (var messageCategory in messageCategoryList)
    {
        var category = availableCategories.Find(c => c.Name.Equals(messageCategory, StringComparison.OrdinalIgnoreCase));

        if (category != null)
        {
            // Print the category name and its associated color
            Console.WriteLine(category);
        }
        else
        {
            Console.WriteLine($"Category: {messageCategory}, Color: Not found");
        }
    }
}