Baca File MS Outlook PST di C# .NET

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

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 properti Messages dari instance kelas ConversationThread 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.

Lihat juga