การอ่านและแปลงไฟล์ Outlook

ทำงานกับไฟล์ OST

Aspose.Email for .NET มี API สำหรับอ่านไฟล์ OST ของ Microsoft Outlook คุณสามารถโหลดไฟล์ 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 โดยใช้บรรทัดโค้ดเดียวกันกับ รูปแบบไฟล์ enumerator ปัจจุบัน API รองรับการแปลงฟอร์แมต OST ไปเป็น PST ยกเว้นเวอร์ชัน 2013/2016/2019/2021 และรุ่นต่อไป ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแปลง OST เป็น PST

สำหรับการทำงานอื่นกับไฟล์ OST โปรดดูหน้านี้ต่อไปนี้:

แปลง PST เป็น OST

การแปลงจาก PST เป็น OST ไม่ได้รับการสนับสนุนโดย Aspose.Email เนื่องจาก OST จะถูกสร้างโดย Outlook เสมอเมือเพิ่มบัญชีและซิงค์กับเซิร์ฟเวอร์เมล ความแตกต่างระหว่างไฟล์ PST และ OST คือ PST มีอยู่เฉพาะในเครื่องเท่านั้น ส่วนเนื้อหา OST มีอยู่บนเซิร์ฟเวอร์อีเมล ดังนั้นจึงไม่จำเป็นต้องแปลง PST เป็น OST เพื่อใช้งานในเครื่อง แต่คุณสามารถนำเข้า PST ไปยังบัญชีที่มีอยู่ได้โดยใช้วิซอร์ด Import/Export ใน Outlook

OLM คือรูปแบบไฟล์เฉพาะที่ Microsoft Outlook ใช้สำหรับจัดเก็บข้อมูลในเครื่อง เช่น อีเมล, ไฟล์แนบ, โน้ต, ข้อมูลปฏิทิน, รายชื่อผู้ติดต่อ, งาน, ประวัติและอื่น ๆ ไฟล์ OLM รองรับเฉพาะ Outlook สำหรับ Mac เท่านั้นและไม่สามารถเปิดหรือเข้าถึงได้โดย 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, the 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 API

คุณสามารถแยกรายการทั้งหมดจากไฟล์ Outlook OLM ได้มากที่สุดโดยไม่โยนข้อยกเว้น แม้บางข้อมูลของไฟล์ต้นฉบับจะเสียหาย เพื่อทำเช่นนี้ ให้ใช้ OlmStorage(TraversalExceptionsCallback callback) คอนสตรัคเตอร์และ Load(string fileName) เมธอดแทนเมธอด FromFile. ตัวสร้างอนุญาตให้กำหนดเมธอด callback.

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

เมธอด callback ทำให้ข้อยกเว้นในการโหลดและการทริเวิร์สสามารถเข้าถึงได้.

นี้ Load เมธอดคืนค่า ’true’ หากไฟล์โหลดสำเร็จและสามารถเดินสำรวจต่อได้ หากไฟล์เสียหายและไม่สามารถเดินสำรวจได้ จะคืนค่า ‘false’.

if (olm.Load(fileName))

โค้ดสแนปและขั้นตอนต่อไปนี้แสดงวิธีใช้ API นี้:

  1. สร้างอินสแตนซ์ใหม่ของ OlmStorage คลาส โดยส่ง callback การจัดการข้อยกเว้นเพื่อจัดการกับข้อผิดพลาดที่เกิดขึ้นระหว่างกระบวนการ.
  2. โหลดไฟล์ OLM โดยเรียก Load เมธอดของอินสแตนซ์ OlmStorage.
  3. หากไฟล์ OLM ถูกโหลดสำเร็จ ให้ดึงโครงสร้างโฟลเดอร์โดยเรียก GetFolders เมธอดบนอินสแตนซ์ OlmStorage ซึ่งจะคืนค่าเป็นรายการของอ็อบเจกต์ OlmFolder.
  4. เรียกเมธอด ExtractItems โดยส่งอินสแตนซ์ OlmStorage และรายการของอ็อบเจกต์ OlmFolder.
  5. ในเมธอด ExtractItems ให้วนซ้ำผ่านแต่ละโฟลเดอร์ในรายการ folders.
  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 คลาสดึงตัวระบุการเข้าข้อความ overload ExtractMapiMessage(string id) เมธอดของ OlmStorage คลาสดึงข้อความจาก OLM.

โค้ดด้านล่างแสดงวิธีดึงข้อความจาก OLM ตามตัวระบุ.

โค้ดทำขั้นตอนต่อไปนี้:

  1. เริ่มต้น foreach loop เพื่อวนรายการของ 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 property ที่คืนค่าที่อยู่ของโฟลเดอร์ โค้ดตัวอย่างต่อไปนี้แสดงการใช้ OlmFolder.Path property เพื่อดึงเส้นทางโฟลเดอร์ในไฟล์ 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 property ที่คืนค่าจำนวนรายการในโฟลเดอร์ โค้ดตัวอย่างต่อไปนี้แสดงการใช้ OlmFolder.MessageCount property เพื่อดึงจำนวนรายการในโฟลเดอร์ของไฟล์ 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 จะเก็บข้อความอีเมล, ข้อมูลปฏิทิน, ข้อมูลผู้ติดต่อ, และการตั้งค่าแอปพลิเคชัน ไฟล์ OLM ไม่ได้รับการสนับสนุนโดย Outlook สำหรับ Windows ดังนั้นจึงไม่สามารถเปิดไฟล์ Outlook for Mac (OLM) ใน Outlook for Windows ได้ หากคุณต้องการย้ายเมลบ็อกซ์จาก Outlook for Mac ไปยัง Outlook for Windows จำเป็นต้องแปลงไฟล์ OLM ของ Outlook for Mac เป็นรูปแบบไฟล์ PST ของ Outlook

ขั้นตอนโค้ด

เพื่อแปลงไฟล์ OLM เป็น PST ให้ทำตามขั้นตอนต่อไปนี้:

  1. สร้างอินสแตนซ์ของ OlmStorage คลาสเพื่อเปิด OLM ต้นทาง.
  2. เปิดไฟล์ OLM ต้นทาง.
  3. สร้างไฟล์ PST ใหม่โดยใช้ สร้าง เมธอด.
  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);
    }
}