قراءة وتحويل ملفات Outlook

العمل مع ملفات OST

توفر Aspose.Email لـ .NET واجهة برمجة تطبيقات لقراءة ملفات Microsoft Outlook OST. يمكنك تحميل ملف OST من قرص أو تدفق إلى نسخة من الـ Aspose.Email.Outlook.Pst.PersonalStorage فئة للوصول إلى محتوياتها، مثل المجلدات والمجلدات الفرعية والرسائل. يقوم Microsoft Outlook بإنشاء ملف PST لتخزين رسائل البريد الإلكتروني عند استخدام خوادم POP3 أو IMAP. بالمقابل، ينشئ ملف OST عندما يكون Microsoft Exchange هو خادم البريد. تدعم ملفات OST أيضًا أحجام ملفات أكبر من ملفات PST.

قراءة ملفات OST

عملية قراءة ملف OST باستخدام Aspose.Email هي نفسها تمامًا لعملية قراءة ملف PST. يمكن لنفس الشيفرة قراءة كل من ملفات PST وOST: فقط قم بتوفير الاسم الصحيح للملف إلى PersonalStorage.FromFile() طريقة. يوضح مقطع الشيفرة التالي كيفية قراءة ملفات OST.

تحويل OST إلى PST

تجعل Aspose.Email من الممكن تحويل ملف OST إلى PST بسطر شيفرة واحد. وبالمثل، يمكن إنشاء ملف OST من ملف PST باستخدام نفس سطر الشيفرة مع FileFormat مؤشر. حاليًا، تدعم الواجهة تحويل صيغ OST إلى PST باستثناء 2013/2016/2019/2021 والإصدارات المستقبلية. يوضح مقطع الشيفرة التالي كيفية تحويل OST إلى PST.

لأداء عمليات أخرى مع ملفات OST، يرجى الرجوع إلى الصفحات التالية:

تحويل PST إلى OST

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

OLM هو تنسيق ملف محدد يستخدمه Microsoft Outlook لتخزين البيانات المحلية مثل الرسائل، المرفقات، الملاحظات، بيانات التقويم، جهات الاتصال، المهام، السجل، والمزيد. ملفات OLM متوافقة فقط مع Outlook لنظام macOS ولا يمكن فتحها أو الوصول إليها بواسطة Outlook لنظام Windows، الذي يستخدم تنسيق 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);
        }
    }
}

استخدام واجهة برمجة تطبيقات Traversal

يمكنك استخراج جميع العناصر من ملف Outlook OLM إلى أقصى حد ممكن، دون إلقاء استثناءات، حتى إذا كان بعض بيانات الملف الأصلي تالفة. لتنفيذ ذلك، استخدم OlmStorage(TraversalExceptionsCallback callback) المُنشئ و Load(string fileName) طريقة بدلاً من طريقة FromFile. يتيح المنشئ تعريف طريقة رد نداء.

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

طريقة رد النداء تجعل استثناءات التحميل والتجوال متاحة.

الـ Load تُعيد الطريقة ’true’ إذا تم تحميل الملف بنجاح وكان من الممكن مواصلة التصفح. إذا كان الملف تالفًا ولا يمكن التصفح، تُرجع ‘false’.

if (olm.Load(fileName))

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

  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 لأنظمة Mac. تخزن ملفات OLM رسائل البريد الإلكتروني، بيانات التقويم، بيانات جهات الاتصال، وإعدادات التطبيقات. لا يدعم Outlook لنظام Windows ملف OLM. وبالتالي، لا يمكن فتح ملف OLM (Outlook for Mac) في Outlook لنظام Windows. إذا كنت تريد نقل صندوق بريدك من Outlook لنظام Mac إلى Outlook لنظام Windows، فمن الضروري تحويل ملف OLM الخاص بـ Outlook لنظام Mac إلى تنسيق ملف 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);
    }
}