อ่านไฟล์ MS Outlook PST ใน C# .NET

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

คุณสมบัติ MAPI ที่ใช้เพื่อสนับสนุนเธรดการสนทนา

เนื่องจากข้อความใน pst ถูกจัดเก็บเป็นชุดของคุณสมบัติ MAPI เราจำเป็นต้องกำหนดคุณสมบัติ MAPI ซึ่งเกี่ยวข้องกับการรวบรวมข้อความตอบกลับ ซึ่งอธิบายไว้ใน ส่วน Microsoft Docs อย่างที่คุณเห็น คุณสมบัติ PidTagConversationIndex ช่วยให้ระบุได้อย่างแม่นยำว่าข้อความนั้นเชื่อมโยงกับการสนทนาบางรายการหรือไม่ คุณสมบัติยังระบุตำแหน่งข้อความสัมพัทธ์ภายในเธรดการสนทนา ไปที่หน้า สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติ PidTagConversationIndex ส่วนหัวคือ 22 ไบต์แรกของค่าคุณสมบัติ PidTagConversationIndex เป็นส่วนข้อมูลเพื่อตรวจสอบว่าข้อความเป็นของเธรดการสนทนาหรือไม่

C# .NET API เพื่ออ่านไฟล์ Outlook PST

ในการ อ่านไฟล์ PST เราจะใช้ Aspose.Email for .NET เป็นไลบรารีที่ยอดเยี่ยมสำหรับการนำแอปประมวลผลอีเมลมาใช้โดยใช้ .NET เมื่อใช้ไลบรารี คุณสามารถจัดการกับรูปแบบไฟล์อีเมลต่างๆ ได้อย่างง่ายดาย คุณสามารถติดตั้ง Aspose.Email for .NET ผ่าน NuGet หรือ ดาวน์โหลด DLL

PM> Install-Package Aspose.Email

จัดกลุ่มข้อความใน PST ตามเธรดการสนทนา

หากต้องการจัดกลุ่มข้อความใน PST ตามการสนทนา เราต้องการสิ่งต่อไปนี้:

  • ขั้นแรก สร้างคลาส ConversationThread เป็นคอนเทนเนอร์สำหรับจัดกลุ่มข้อความภายในการสนทนา
  • จากนั้น สร้างวิธีการค้นหาและจัดกลุ่มข้อความตามการสนทนา
  • สุดท้าย สร้างเมธอดเพื่อบันทึกเธรดการสนทนาไปยังไดเร็กทอรีแยกต่างหาก

สร้างคลาส ConversationThread

จะมีคุณสมบัติดังนี้

  • Id: การแสดงสตริงของส่วนหัวดัชนีการสนทนา (22 ไบต์)
  • ข้อความ: รายการรหัสข้อความที่อยู่ในเธรดการสนทนา
///<summary>
/// แสดงข้อความภายในเธรดการสนทนา
///</summary>
public class ConversationThread
{
    private string id;
    private List<string> messages;
    
    ///<summary>
    /// เริ่มต้นอินสแตนซ์ใหม่ของ<see cref="ConversationThread"/> ระดับ.
    ///</summary>
    ///<param name="id"> การแสดงสตริงของส่วนหัวดัชนีการสนทนา</param>
    public MessageThread(string id)
    {
        this.id = id;
        this.messages = new List<string>();
    }
    
    ///<summary>
    /// รับหรือตั้งค่าการแสดงสตริง HEX ของส่วนหัวดัชนีการสนทนา (22 ไบต์)
    ///</summary>
    public string Id { get => id; set => id = value; }
    
    ///<summary>
    /// รับรายการรหัสข้อความที่อยู่ในเธรดการสนทนา
    ///</summary>
    public List<string> Messages { get => messages; }
}

สร้างวิธีการค้นหาและจัดกลุ่มข้อความตามการสนทนา

หลังจากสร้างคลาส ConversationThread แล้ว เราสามารถมุ่งเน้นไปที่การเขียนเมธอดที่ทำสิ่งต่อไปนี้:

  • อ่านข้อความทั้งหมดในโฟลเดอร์ ด้วยเหตุผลด้านประสิทธิภาพ เราจะอ่านตัวระบุข้อความโดยใช้เมธอด EnumerateMessagesEntryId เท่านั้น
  • สำหรับแต่ละข้อความ เราจะแยกคุณสมบัติ PidTagConversationIndex โดยใช้เมธอด ExtractProperty
  • ข้อความที่มีค่าพร็อพเพอร์ตี้ “PidTagConversationIndex” 22 ไบต์แรกเหมือนกันจะอยู่ในการสนทนาเดียวกัน เราจะเพิ่มรหัสข้อความในรายการที่แสดงโดยคุณสมบัติ Messages ของอินสแตนซ์คลาส ConversationThread ที่สอดคล้องกัน
  • ส่งคืนรายการอินสแตนซ์ ConversationThread
using Aspose.Email.Mapi;
using Aspose.Email.Storage.Pst;

public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder)
{
    // ผลลัพธ์
    var list = new List<ConversationThread>();
        
    foreach (var entryId in folder.EnumerateMessagesEntryId())
    {
        // แยกคุณสมบัติ PidTagConversationIndex และค่าส่วนหัว (22 ไบต์)
        var convIndexTag = KnownPropertyList.ConversationIndex.Tag;
        var convIndexProperty = pst.ExtractProperty(Convert.FromBase64String(entryId), convIndexTag);
        var convIndexHeader = (convIndexProperty != null && convIndexProperty.Data != null) ? convIndexProperty.Data.Take(22).ToArray() : null;
        var convIndexHeaderString = convIndexHeader != null ? 
			      BitConverter.ToString(convIndexHeader).Replace('-', '') : null;
        
        if (convIndexHeaderString != null)
        {
            var convThread = list.Find(x => x.Id == convIndexHeaderString);
            
            if (convThread == null)
            {
                convThread = new ConversationThread(convIndexHeaderString);
                convThread.Messages.Add(entryId);
                list.Add(convThread);
            }
            else
            {
                convThread.Messages.Add(entryId);
            }
        }
    }
        
    return list.Where(x => x.Messages.Count > 1).ToList();
}

สร้างเมธอดเพื่อบันทึกเธรดการสนทนาไปยังไดเร็กทอรีแยกต่างหาก

สุดท้าย มาบันทึกการสนทนาในไดเร็กทอรี

สำหรับแต่ละอินสแตนซ์ ConversationThread ให้ทำดังต่อไปนี้:

  • สร้างไดเร็กทอรีแยกต่างหากโดยใช้ชื่อหัวข้อเธรด
  • ระบุตัวระบุในคุณสมบัติ ConversationThread.Messages สำหรับตัวระบุแต่ละตัวจะแยกข้อความโดยใช้เมธอด ExtractMessage และบันทึกข้อความในไดเร็กทอรีที่สร้างขึ้นโดยใช้เมธอด Save
public void SaveThreads(List<ConversationThread> list, string outDirectory)
{
    var invalidChars = Path.GetInvalidFileNameChars();
    
    foreach (var item in list)
    {
        string? threadDirectory = null;
        var i = item.Messages.Count - 1;
        
        foreach (var entryId in item.Messages)
        {
            var msg = pst.ExtractMessage(entryId);
            
            if (threadDirectory == null)
            {
                var threadName = new string(msg.ConversationTopic.Where(x => !invalidChars.Contains(x)).ToArray()).Trim();
                threadDirectory = Path.Combine(outDirectory, threadName);
                Directory.CreateDirectory(threadDirectory);
            }
            
            msg.Save(Path.Combine(threadDirectory, $"{i--}.msg"));
        }
        
        threadDirectory = null;
    }
}

รับใบอนุญาต API ฟรี

คุณสามารถใช้ Aspose.Email for .NET ได้โดยไม่มีข้อจำกัดในการประเมินโดยใช้ ใบอนุญาตชั่วคราวฟรี

บทสรุป

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

ดูสิ่งนี้ด้วย