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