A Utas Percakapan adalah urutan balasan pesan dengan topik utas umum. Pesan dalam percakapan dapat ditampilkan dalam berbagai cara, seperti dalam urutan hierarkis atau kronologis. Untuk menampilkan utas pesan, aplikasi email mengidentifikasi balasan pesan. Format file email paling populer menyediakan fitur ini. Utas percakapan memungkinkan pembaca untuk memahami keseluruhan struktur percakapan dengan cepat, menyoroti poin-poin percakapan tertentu, dan menganalisis informasi penting. Dalam artikel ini, kami akan berfokus pada penggunaan fitur PST/MAPI Aspose.Email untuk menemukan dan mengelompokkan pesan berdasarkan percakapan. Untuk melakukan ini, kami akan menerapkan kode sampel yang akan menelusuri pesan dalam folder tertentu, mengelompokkannya berdasarkan percakapan, lalu menyimpan setiap percakapan ke direktori disk terpisah.
- Properti MAPI yang digunakan untuk Mendukung Utas Percakapan
- C# .NET API untuk Membaca File Outlook PST
- Kelompokkan pesan di PST berdasarkan utas percakapan
Properti MAPI yang digunakan untuk Mendukung Utas Percakapan
Karena pesan di pst disimpan sebagai sekumpulan properti MAPI, kita perlu mendefinisikan properti MAPI yang terkait dengan mengumpulkan balasan pesan.
Ini dijelaskan di bagian Microsoft Docs.
Seperti yang bisa dilihat, properti PidTagConversationIndex memungkinkan untuk menentukan secara akurat apakah suatu pesan dikaitkan dengan percakapan tertentu atau tidak. Properti juga menunjukkan posisi pesan relatif dalam utas percakapan. Kunjungi halaman untuk informasi selengkapnya tentang properti PidTagConversationIndex
. Header adalah 22 byte pertama dari nilai properti PidTagConversationIndex
. Ini adalah bagian data untuk menentukan apakah pesan tersebut milik utas percakapan tertentu.
C# .NET API untuk Membaca File Outlook PST
Untuk membaca file PST, kita akan menggunakan Aspose.Email for .NET. Ini adalah perpustakaan yang luar biasa untuk mengimplementasikan aplikasi pemrosesan email menggunakan .NET. Menggunakan perpustakaan, Anda dapat dengan mudah menangani banyak format file email yang berbeda. Anda dapat menginstal Aspose.Email for .NET melalui NuGet atau unduh DLL-nya.
PM> Install-Package Aspose.Email
Kelompokkan pesan di PST berdasarkan utas percakapan
Untuk mengelompokkan pesan di PST berdasarkan percakapan, kami memerlukan yang berikut ini:
- Pertama, buat kelas
ConversationThread
. Ini adalah wadah untuk mengelompokkan pesan dalam percakapan. - Kemudian, buat metode untuk menelusuri dan mengelompokkan pesan berdasarkan percakapan.
- Terakhir, buat metode untuk menyimpan utas percakapan ke direktori terpisah.
Buat kelas ConversationThread
Ini akan memiliki properti berikut.
Id
: representasi string dari header indeks percakapan (22 byte).Pesan
: daftar ID pesan yang ada di utas percakapan.
///<summary>
/// Mewakili pesan dalam utas percakapan.
///</summary>
public class ConversationThread
{
private string id;
private List<string> messages;
///<summary>
/// Menginisialisasi instance baru dari<see cref="ConversationThread"/> kelas.
///</summary>
///<param name="id"> Representasi string dari header indeks percakapan.</param>
public MessageThread(string id)
{
this.id = id;
this.messages = new List<string>();
}
///<summary>
/// Mendapat atau menyetel representasi string HEX dari header indeks percakapan (22 byte).
///</summary>
public string Id { get => id; set => id = value; }
///<summary>
/// Mendapat daftar ID pesan yang ada di dalam utas percakapan.
///</summary>
public List<string> Messages { get => messages; }
}
Buat metode untuk mencari dan mengelompokkan pesan berdasarkan percakapan
Setelah membuat class ConversationThread
, kita dapat berfokus pada penulisan metode yang melakukan hal berikut:
- Telusuri semua pesan di folder. Untuk alasan kinerja, kami hanya akan membaca pengenal pesan menggunakan metode EnumerateMessagesEntryId.
- Untuk setiap pesan, kami akan mengekstrak properti
PidTagConversationIndex
menggunakan metode ExtractProperty. - Pesan yang memiliki 22 byte pertama yang sama dari nilai properti
PidTagConversationIndex
termasuk dalam percakapan yang sama. Kami akan menambahkan Id pesan ke daftar yang diwakili oleh propertiMessages
dari instance kelasConversationThread
yang sesuai. - Kembalikan daftar instance
ConversationThread
.
using Aspose.Email.Mapi;
using Aspose.Email.Storage.Pst;
public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder)
{
// Hasil
var list = new List<ConversationThread>();
foreach (var entryId in folder.EnumerateMessagesEntryId())
{
// Ekstrak properti PidTagConversationIndex dan nilai headernya (22 byte).
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();
}
Buat metode untuk menyimpan utas percakapan ke direktori terpisah
Terakhir, mari simpan percakapan di direktori.
Untuk setiap instance ConversationThread
, lakukan hal berikut:
- Buat direktori terpisah dengan nama topik utas.
- Hitung pengidentifikasi dalam properti
ConversationThread.Messages
, untuk setiap pengidentifikasi ekstrak pesan menggunakan metode ExtractMessage dan simpan pesan di direktori yang dibuat menggunakan metode 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;
}
}
Dapatkan Lisensi API Gratis
Anda dapat menggunakan Aspose.Email for .NET tanpa batasan evaluasi menggunakan lisensi sementara gratis.
Kesimpulan
Artikel ini menunjukkan cara menggunakan Aspose.Email untuk mencari pesan terkait percakapan di PST. Dengan menjelajahi dokumentasi PidTagConversationIndex lebih lanjut, Anda juga dapat memperumit implementasi dengan menambahkan, misalnya, pengurutan hierarki pesan percakapan. Anda dapat mempelajari lebih lanjut tentang Aspose.Email menggunakan dokumentasi. Jika Anda memiliki pertanyaan, Anda dapat memposting ke forum kami.