خواندن و تبدیل فایل‌های Outlook

کار با فایل‌های OST

Aspose.Email برای .NET یک API برای خواندن فایل‌های OST مایکروسافت Outlook فراهم می‌کند. می‌توانید یک فایل OST را از دیسک یا یک جریان به یک نمونه از Aspose.Email.Outlook.Pst.PersonalStorage کلاسی برای دسترسی به محتویات آن، مانند پوشه‌ها، زیرپوشه‌ها و پیام‌ها. مایکروسافت Outlook یک فایل PST ایجاد می‌کند تا ایمیل‌ها را هنگام استفاده از سرورهای پست POP3 یا IMAP ذخیره کند. در مقابل، هنگام استفاده از سرور Microsoft Exchange، یک فایل OST ایجاد می‌شود. فایل‌های OST همچنین از اندازه‌های بزرگ‌تری نسبت به فایل‌های PST پشتیبانی می‌کنند.

خواندن فایل‌های OST

فرایند خواندن یک فایل OST با Aspose.Email دقیقاً همانند خواندن یک فایل PST است. همان کد می‌تواند هر دو فایل PST و OST را بخواند: فقط نام فایل صحیح را به PersonalStorage.FromFile() متد. قطعه‌کد زیر نشان می‌دهد چگونه فایل‌های OST را بخوانید.

تبدیل OST به PST

Aspose.Email امکان تبدیل یک فایل OST به PST را با یک خط کد فراهم می‌کند. به‌ طور مشابه، می‌توان فایل OST را از فایل PST با استفاده از همان خط کد و FileFormat enumerator. در حال حاضر، API از تبدیل فرمت‌های OST به PST به جز نسخه‌های 2013/2016/2019/2021 و نسخه‌های آینده پشتیبانی می‌کند. قطعه کد زیر نشان می‌دهد چگونه OST را به PST تبدیل کنید.

برای انجام عملیات دیگر با فایل‌های OST، لطفاً به صفحات زیر مراجعه کنید:

تبدیل PST به OST

تبدیل از PST به OST توسط Aspose.Email پشتیبانی نمی‌شود زیرا OST همیشه توسط اوتلوک هنگام افزودن حساب و همگام‌سازی با سرور ایمیل ایجاد می‌شود. تفاوت بین فایل‌های PST و OST این است که PST تنها به صورت محلی در دسترس است. محتوای OST نیز بر روی سرور ایمیل در دسترس است. بنابراین نیازی به تبدیل PST به OST برای استفاده محلی نیست. اما می‌توانید PST را با استفاده از ویزارد وارد/صادر کردن در اوتلوک به یک حساب موجود وارد کنید.

OLM یک قالب فایل خاص است که توسط Microsoft Outlook برای ذخیره‌سازی داده‌های محلی مانند ایمیل‌ها، پیوست‌ها، یادداشت‌ها، داده‌های تقویم، مخاطبین، کارها، تاریخچه و غیره استفاده می‌شود. فایل‌های OLM فقط با Outlook برای مک سازگار هستند و نمی‌توانند توسط Outlook برای ویندوز که از قالب فایل PST استفاده می‌کند، باز یا دسترسی یافت.

کار با فایل‌های OLM

باز کردن فایل‌های OLM

فایل‌های فرمت OLM می‌توانند به دو روش باز شوند:

  • استفاده از سازنده
  • استفاده از متد استاتیک FromFile

رفتار این روش‌ها متفاوت است. بخش زیر را ببینید.

استفاده از سازنده

برای باز کردن یک فایل، سازندهٔ OlmStorage کلاس و نام کامل فایل یا جریان را به عنوان آرگومان به آن پاس دهید:

var fileName = "MyStorage.olm";
var olm = new OlmStorage(fileName);

استفاده از متد ایستا FromFile

برای باز کردن یک فایل، از متد استاتیک استفاده کنید FromFile و نام کامل فایل یا جریان را به عنوان آرگومان به آن پاس بدهید:

var fileName = "MyStorage.olm";
var olm = OlmStorage.FromFile(fileName);

دریافت پوشه‌ها

برای دسترسی به ساختار دایرکتوری یک فایل OLM، یک نمونه از OlmStorage کلاس را با استفاده از سازنده‌اش ایجاد کنید و مسیر فایل را به آن پاس بدهید. پس از باز شدن فایل، ساختار دایرکتوری آن را با استفاده از FolderHierarchy ویژگی دسترسی پیدا کنید. این ویژگی فهرستی از OlmFolder اشیائی که هر کدام نمایانگر یک دایرکتوری در فایل OLM هستند. برای بررسی بیشتر ساختار دایرکتوری، به SubFolders ویژگی هر شیء که فهرست زیرپوشه‌های آن را برمی‌گرداند. با استفاده از این ویژگی‌ها می‌توانید در تمام ساختار سلسله‌مراتبی دایرکتوری‌های فایل OLM به مرور بپردازید و به تمام پوشه‌ها و زیرپوشه‌های آن دسترسی داشته باشید.

مثال زیر فهرست تمام پوشه‌ها را به صورت سلسله‌مراتبی نمایش می‌دهد:

using (var olm = new OlmStorage(fileName))
{
    PrintAllFolders(olm.FolderHierarchy, string.Empty);
}

private void PrintAllFolders(List<OlmFolder> folderHierarchy, string indent)
{
    foreach (var folder in folderHierarchy)
    {
        Console.WriteLine($"{indent}{folder.Name}");
        PrintAllFolders(folder.SubFolders, indent+"-");
    }
}

هنگام استفاده از FromFile متد برای باز کردن یک فایل OLM، FolderHierarchy این ویژگی به‌طور پیش‌فرض مقداردهی اولیه نمی‌شود و null برمی‌گرداند. در این حالت، برای مقداردهی اولیه، متد GetFolders را صریحاً فراخوانی کنید. FolderHierarchy ویژگی و دریافت فهرست دایرکتوری‌های موجود در فایل OLM:

using (var olm = OlmStorage.FromFile(fileName))
{
    var folders = olm.GetFolders();
}

همچنین می‌توان هر پوشه‌ای را بر اساس نام دریافت کرد:

  1. فراخوانی کنید GetFolder متد.
  2. نام پوشه را به عنوان آرگومان اول و مقدار نشان‌دهنده این‌که آیا هنگام جستجوی پوشه حساس به حروف باشد یا نه را به عنوان پارامتر دوم ارسال کنید.
using (var olm = OlmStorage.FromFile(fileName))
{
    // get inbox folder by name
    OlmFolder folder = olm.GetFolder("Inbox", true);
}

لیست ایمیل‌ها

OlmFolder کلاس، که نمایانگر یک پوشه است، دارای متدهای زیر برای دریافت لیست ایمیل‌ها است:

  • EnumerateMessages تکرار ایمیل‌ها در یک پوشه را پیاده‌سازی می‌کند. در این حالت، هر تکرار باز می‌گرداند OlmMessageInfo شیئی که اطلاعات کوتاهی درباره ایمیل ارائه می‌دهد.
  • EnumerateMapiMessages، همچنین تکرار ایمیل‌ها در یک پوشه را پیاده‌سازی می‌کند، اما در این حالت، هر تکرار باز می‌گرداند MapiMessage شیئی که نمایانگر خود ایمیل است، با تمام ویژگی‌ها.

استفاده از روش EnumerateMessages

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);
    foreach (var messageInfo in folder.EnumerateMessages())
    {
        Console.WriteLine(messageInfo.Subject);
    }
}

استفاده از روش EnumerateMapiMessages

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var msg in folder.EnumerateMapiMessages())
    {
        // save message in MSG format
        msg.Save($"{msg.Subject}.msg");
    }
}

سایر ویژگی‌های مفید

ویژگی‌های مفید دیگر کلاس OlmFolder عبارتند از: HasMessages و MessageCount ویژگی‌هایی که وجود پیام‌ها در پوشه و تعداد آن‌ها را برمی‌گردانند.

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    if (folder.HasMessages)
    {
        Console.WriteLine($"Message count: {folder.MessageCount}");
    }
}

دریافت یا تنظیم تاریخ تغییر یک پیام

تاریخ اصلاح شده نشان‌دهنده تاریخ و زمان آخرین اصلاح پیام OLM است. می‌توانید از OlmMessageInfo.ModifiedDate ویژگی برای بازیابی یا به‌روزرسانی مقدار تاریخ اصلاح شدهٔ یک پیام OLM.

در اینجا یک مثال که استفاده از ویژگی را نشان می‌دهد:

foreach (OlmMessageInfo messageInfo in inboxFolder.EnumerateMessages())
{
   DateTime modifiedDate = messageInfo.ModifiedDate;
}

استخراج ایمیل‌ها و آیتم‌ها

OlmStorage کلاس دارای ExtractMapiMessage متدی که امکان استخراج ایمیل‌ها را می‌دهد. این متد یک OlmMessageInfo شیء.

using (var olm = OlmStorage.FromFile(fileName))
{
    var folder = olm.GetFolder("Inbox", true);

    foreach (var messageInfo in folder.EnumerateMessages())
    {
        if (messageInfo.Date == DateTime.Today)
        {
            // Extracts today's messages form Inbox
            var msg = olm.ExtractMapiMessage(messageInfo);
        }
    }
}

استفاده از API پیمایش

می‌توانید تمام آیتم‌ها را از یک فایل OLM در Outlook تا حد امکان استخراج کنید، بدون پرتاب استثناها، حتی اگر برخی داده‌های فایل اصلی خراب باشند. برای انجام این کار، از OlmStorage(TraversalExceptionsCallback callback) سازنده و Load(string fileName) متد به‌جای متد FromFile استفاده می‌شود. سازنده امکان تعریف یک متد کال‌بک را فراهم می‌کند.

using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))

متد کال‌بک، استثنای‌های بارگذاری و مرور را در دسترس قرار می‌دهد.

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

if (olm.Load(fileName))

کد نمونه زیر و مراحل، نشان می‌دهند چطور از این API استفاده کنید:

  1. یک نمونهٔ جدید از OlmStorage کلاس، به‌همراه یک کال‌بک برای مدیریت استثناها تا هر استثنای رخ‌داده در طول فرآیند را مدیریت کند.
  2. فایل OLM را با فراخوانی Load متد نمونه OlmStorage بدست آورید.
  3. اگر فایل OLM با موفقیت بارگذاری شد، ساختار سلسله‌مراتبی پوشه‌ها را با فراخوانی GetFolders متد روی نمونه OlmStorage. این متد لیستی از اشیاء OlmFolder را برمی‌گرداند.
  4. متد ExtractItems را فراخوانی کنید و نمونه OlmStorage و لیست اشیاء OlmFolder را به‌عنوان پارامترها پاس دهید.
  5. در متد ExtractItems، بر هر پوشه در لیست پوشه‌ها پیمایش کنید.
  6. اگر پوشه شامل پیام‌ها (ایمیل‌ها) باشد، نام پوشه را با استفاده از Console.WriteLine(folder) در کنسول چاپ کنید.
  7. با فراخوانی متد EnumerateMessages روی نمونه OlmStorage و عبور پوشه جاری به‌عنوان آرگومان، بر پیام‌های موجود در پوشه جاری پیمایش کنید.
  8. موضوع هر پیام را با استفاده از Console.WriteLine(msg.Subject) بر روی کنسول چاپ کنید.
  9. اگر پوشه زیرپوشه داشته باشد، به‌صورت بازگشتی متد ExtractItems را دوباره فراخوانی کنید و نمونه OlmStorage و زیرپوشه‌های پوشه جاری را پاس بدهید.
using (var olm = new OlmStorage((exception, id) => { /* Exception handling  code. */ }))
{
    if (olm.Load(fileName))
    {
        var folderHierarchy = olm.GetFolders();
        ExtractItems(olm, folderHierarchy);
    }
}

private static void ExtractItems(OlmStorage olm, List<OlmFolder> folders)
{
    foreach (var folder in folders)
    {
        if (folder.HasMessages)
        {
            Console.WriteLine(folder);

            foreach (var msg in olm.EnumerateMessages(folder))
            {
                Console.WriteLine(msg.Subject);
            }
        }

        if (folder.SubFolders.Count > 0)
        {
            ExtractItems(olm, folder.SubFolders);
        }
    }
}

استخراج پیام‌ها بر اساس شناسه‌ها

گاهی اوقات لازم است پیام‌های انتخابی را بر اساس شناسه‌ها استخراج کنیم. به عنوان مثال، برنامهٔ شما شناسه‌ها را در یک پایگاه داده ذخیره می‌کند و به‌صورت درخواست‌محور پیام را استخراج می‌کند. این روش کارآمدی است برای جلوگیری از عبور از کل ذخیره‌سازی در هر بار برای یافتن پیام خاصی که باید استخراج شود. این ویژگی برای ذخیره‌سازی‌های OLM در دسترس است. EntryId ویژگی OlmMessageInfo کلاس شناسه ورودی پیام را دریافت می‌کند. بارگذاری‌شده ExtractMapiMessage(string id) متد از OlmStorage کلاس پیام را از OLM دریافت می‌کند.

کد زیر نشان می‌دهد چگونه پیام‌ها را از OLM بر اساس شناسه‌ها استخراج کنید.

کد مراحل زیر را انجام می‌دهد:

  1. یک حلقه foreach را برای تکرار در فهرست یک OlmMessageInfo آبجکت‌ها. حلقه از EnumerateMessages متد آبجکت olmFolder برای بازیابی فهرست تمام پیام‌های موجود در پوشهٔ جاری که در حال تکرار است.
  2. حلقه شیء MapiMessage مربوطه را از ذخیره‌سازی استخراج می‌کند با فراخوانی ExtractMapiMessage(string id) متد OlmStorage کلاس، با عبور EntryId از پیام فعلی به‌عنوان پارامتر.

شیء MapiMessage بازیابی‌شده می‌تواند برای دسترسی و دستکاری محتویات پیام استفاده شود. حلقه تا زمانی که تمام پیام‌های موجود در پوشه پردازش شوند، ادامه دارد.

  foreach (OlmMessageInfo msgInfo in olmFolder.EnumerateMessages())
  {
      MapiMessage msg = storage.ExtractMapiMessage(msgInfo.EntryId);
  }

دریافت مسیر پوشه

شما همچنین می‌توانید مسیر پوشه‌های داخل فایل OML را دریافت کنید. Aspose.Email ارائه می‌دهد OlmFolder.Path خصوصیتی که مسیر پوشه را برمی‌گرداند. قطعه کد زیر استفاده از آن را نشان می‌دهد OlmFolder.Path خصوصیتی برای دریافت مسیرهای پوشه‌ها در فایل OML.

var storage = new OlmStorage("SampleOLM.olm");
PrintPath(storage, storage.FolderHierarchy);

public static void PrintPath(OlmStorage storage, List<OlmFolder> folders)
{
    foreach (OlmFolder folder in folders)
    {
        // print the current folder path
        Console.WriteLine(folder.Path);

        if (folder.SubFolders.Count > 0)
        {
            PrintPath(storage, folder.SubFolders);
        }
    }
}

شمارش آیتم‌ها در پوشه

شما همچنین می‌توانید تعداد آیتم‌ها در پوشه را بشمارید. Aspose.Email ارائه می‌دهد OlmFolder.MessageCount خصوصیتی که تعداد آیتم‌ها در پوشه را برمی‌گرداند. قطعه کد زیر استفاده از آن را نشان می‌دهد OlmFolder.MessageCount خصوصیتی برای دریافت تعداد آیتم‌ها در پوشه‌های فایل OML.

var storage = new OlmStorage("SampleOLM.olm");
PrintMessageCount(storage.FolderHierarchy);

public static void PrintMessageCount(List<OlmFolder> folders)
{
    foreach (OlmFolder folder in folders)
    {
        Console.WriteLine("Message Count [" + folder.Name + "]: " + folder.MessageCount);
    }
}

دریافت شمارش کل آیتم‌های OlmStorage

OlmStorage کلاس همچنین دارد GetTotalItemsCount() متدی که تعداد کل آیتم‌های پیام موجود در ذخیره‌سازی OLM را برمی‌گرداند.

  using (var olm = new OlmStorage("storage.olm"))
  {
     var count = olm.GetTotalItemsCount();
  }

دریافت رنگ‌های دسته Outlook

برای کار با رنگ‌های دسته یا دسته‌های آیتم Outlook که در فایل‌های OLM ذخیره شده‌اند، Aspose.Email راه‌حل‌های زیر را ارائه می‌دهد:

  • OlmItemCategory کلاس - نمایانگر دسته‌های آیتم Outlook است که بر اساس نام و رنگ‌های مرتبط، به‌صورت فرمت هگزادسیمال در دسترس هستند.
  • GetCategories() متد از OlmStorage کلاس - فهرست دسته‌ها را بازیابی می‌کند.

نمونه کد زیر نشان می‌دهد چگونه تمام دسته‌های استفاده‌شده را از ذخیره‌سازی OML دریافت کنید:

using (var olm = OlmStorage.FromFile("storage.olm"))
{
    var categories = olm.GetCategories();
    
    foreach (var category in categories)
    {
        Console.WriteLine($"Category name: {category.Name}");
        
        //Color is represented as a hexadecimal value: #rrggbb
        Console.WriteLine($"Category color: {category.Color}");
    }
}

نمونه کد زیر نشان می‌دهد چگونه رنگ دسته‌بندی یک پیام را دریافت کنید:

foreach (var msg in olm.EnumerateMessages(folder))
{
    if (msg.Categories != null)
    {
        foreach (var msgCategory in msg.Categories)
        {
            Console.WriteLine($"Category name: {msgCategory}");
            var categoryColor = cat.First(c => c.Name.Equals(msgCategory, StringComparison.OrdinalIgnoreCase)).Color;
            Console.WriteLine($"Category color: {categoryColor}");
        }
    }
}

تبدیل OLM به PST

OLM یک فرمت فایل پایگاه داده است که توسط Microsoft Outlook برای سیستم‌های مک استفاده می‌شود. فایل‌های OLM پیام‌های ایمیل، داده‌های تقویم، داده‌های مخاطبین و تنظیمات برنامه را ذخیره می‌کنند. یک فایل OLM توسط Outlook برای ویندوز پشتیبانی نمی‌شود. به همین دلیل امکان باز کردن یک فایل Outlook برای مک (OLM) در Outlook برای ویندوز وجود ندارد. اگر می‌خواهید صندوق‌پستی خود را از Outlook برای مک به Outlook برای ویندوز منتقل کنید، لازم است فایل OLM Outlook برای مک را به فرمت فایل PST Outlook تبدیل کنید.

مراحل کد

برای تبدیل یک فایل OLM به PST، مراحل زیر را دنبال کنید:

  1. یک نمونه از OlmStorage کلاسی برای باز کردن OLM منبع.
  2. یک فایل OLM منبع را باز کنید.
  3. یک فایل PST جدید ایجاد کنید با استفاده از Create متد.
  4. یک متد GetContainerClass ایجاد کنید تا کلاس پیام را به کلاس پوشه نگاشت کند.
  5. یک متد AddToPst ایجاد کنید که به‌صورت بازگشتی هر پوشه و پیام‌های آن را از OLM با استفاده از متد EnumerateMapiMessages بخواند و آن‌ها را به PST به همان ترتیب با استفاده از متدهای AddSubFolder و AddMessage اضافه کند.

نمونهٔ کد

نمونه کد زیر نشان می‌دهد چگونه OLM را به PST تبدیل کنید.

متد Main:

// create an instance of OlmStorage class to open source OLM
using (var olm = new OlmStorage("my.olm"))
// create a new PST file
using (var pst = PersonalStorage.Create("my.pst", FileFormatVersion.Unicode))
{
    // recursively reads each folder and its messages 
    // and adds them to the PST in the same order
    foreach (var olmFolder in olm.FolderHierarchy)
    {
        AddToPst(pst.RootFolder, olmFolder);
    }
} 

پیاده‌سازی متد GetContainerClass:

public string GetContainerClass(string messageClass)
{
    if (messageClass.StartsWith("IPM.Contact") || messageClass.StartsWith("IPM.DistList"))
    {
        return "IPF.Contact";
    }

    if (messageClass.StartsWith("IPM.StickyNote"))
    {
        return "IPF.StickyNote";
    }

    if (messageClass.StartsWith("IPM.Activity"))
    {
        return "IPF.Journal";
    }

    if (messageClass.StartsWith("IPM.Task"))
    {
        return "IPF.Task";
    }

    if (messageClass.StartsWith("IPM.Appointment") || messageClass.StartsWith("IPM.Schedule.meeting"))
    {
        return "IPF.Appointment";
    }

    return "IPF.Note";
}

پیاده‌سازی متد AddToPst:

public void AddToPst(FolderInfo pstFolder, OlmFolder olmFolder)
{
    FolderInfo pstSubFolder = pstFolder.GetSubFolder(olmFolder.Name);

    foreach (var msg in olmFolder.EnumerateMapiMessages())
    {
        if (pstSubFolder == null)
        {
            pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name, GetContainerClass(msg.MessageClass));
        }

        pstSubFolder.AddMessage(msg);
    }

    if (pstSubFolder == null)
    {

        pstSubFolder = pstFolder.AddSubFolder(olmFolder.Name);
    }

    foreach (var olmSubFolder in olmFolder.SubFolders)
    {
        AddToPst(pstSubFolder, olmSubFolder);
    }
}