C# .NET'te MS Outlook PST Dosyalarını Okuyun

Bir Sohbet Dizisi, ortak bir ileti dizisi konusuna sahip bir iletiye verilen yanıtlar dizisidir. Sohbet içindeki mesajlar, hiyerarşik veya kronolojik sıra gibi çeşitli şekillerde görüntülenebilir. Bir mesaj dizisini görüntülemek için e-posta uygulamaları mesaj yanıtlarını tanımlar. En popüler e-posta dosya biçimleri bu özelliği sağlar. Konuşma dizileri, okuyucuların bir konuşmanın genel yapısını hızlı bir şekilde anlamalarına, konuşmaların belirli noktalarını vurgulamalarına ve önemli bilgileri analiz etmelerine olanak tanır. Bu makalede, Aspose.Email’in PST/MAPI özelliklerini konuşmaya göre mesajları bulmak ve gruplandırmak için kullanmaya odaklanacağız. Bunu yapmak için, belirli bir klasördeki iletileri dolaşacak, bunları konuşmaya göre gruplandıracak ve ardından her konuşmayı ayrı bir disk dizinine kaydedecek bir örnek kod uygulayacağız.

Konuşma Dizisini Desteklemek için kullanılan MAPI Özellikleri

Pst’deki mesajlar bir dizi MAPI özelliği olarak depolandığından, mesaj yanıtlarını toplamakla ilişkili MAPI özelliklerini tanımlamamız gerekir. Bu, Microsoft Docs bölümünde açıklanmaktadır. Görüldüğü gibi PidTagConversationIndex özelliği, bir mesajın belirli bir konuşma ile ilişkilendirilip ilişkilendirilmediğinin doğru bir şekilde tespit edilmesini sağlar. Bu özellik aynı zamanda bir konuşma dizisindeki göreli mesaj konumunu da gösterir. “PidTagConversationIndex” özelliği hakkında daha fazla bilgi için sayfayı ziyaret edin. Başlık, “PidTagConversationIndex” özellik değerinin ilk 22 baytıdır. Mesajın belirli bir konuşma dizisine ait olup olmadığını belirlemek için kullanılan bir veri bölümüdür.

Outlook PST Dosyalarını Okumak için C# .NET API

PST dosyalarını okumak için Aspose.Email for .NET kullanacağız. .NET kullanarak e-posta işleme uygulamalarını uygulamak için harika bir kitaplıktır. Kitaplığı kullanarak, birçok farklı e-posta dosyası biçimini kolayca işleyebilirsiniz. Aspose.Email for .NET’i NuGet veya DLL’sini indir aracılığıyla yükleyebilirsiniz.

PM> Install-Package Aspose.Email

PST’deki iletileri konuşma dizisine göre gruplandırın

PST’deki mesajları konuşmalara göre gruplandırmak için aşağıdakilere ihtiyacımız var:

  • Öncelikle bir “ConversationThread” sınıfı oluşturun. Bir konuşma içindeki mesajları gruplandırmak için bir kapsayıcıdır.
  • Ardından, iletileri konuşmaya göre aramak ve gruplandırmak için bir yöntem oluşturun.
  • Son olarak, konuşma dizisini ayrı bir dizine kaydetmek için bir yöntem oluşturun.

Bir ConversationThread sınıfı oluşturun

Aşağıdaki özelliklere sahip olacaktır.

  • “Id”: konuşma dizini başlığının dize gösterimi (22 bayt).
  • “Mesajlar”: konuşma dizisindeki mesaj kimliklerinin listesi.
///<summary>
/// Bir konuşma dizisindeki mesajları temsil eder.
///</summary>
public class ConversationThread
{
    private string id;
    private List<string> messages;
    
    ///<summary>
    /// Yeni bir örneğini başlatır<see cref="ConversationThread"/> sınıf.
    ///</summary>
    ///<param name="id"> Konuşma dizin başlığının dize gösterimi.</param>
    public MessageThread(string id)
    {
        this.id = id;
        this.messages = new List<string>();
    }
    
    ///<summary>
    /// Konuşma dizin başlığının (22 bayt) HEX dize temsilini alır veya ayarlar.
    ///</summary>
    public string Id { get => id; set => id = value; }
    
    ///<summary>
    /// Bir konuşma dizisindeki mesaj kimliklerinin bir listesini alır.
    ///</summary>
    public List<string> Messages { get => messages; }
}

İletileri sohbete göre aramak ve gruplandırmak için bir yöntem oluşturun

“ConversationThread” sınıfını oluşturduktan sonra, aşağıdakileri yapan bir yöntem yazmaya odaklanabiliriz:

  • Klasördeki tüm mesajları gözden geçirin. Performans nedeniyle, mesaj tanımlayıcısını yalnızca EnumerateMessagesEntryId yöntemini kullanarak okuyacağız.
  • Her mesaj için, ExtractProperty yöntemini kullanarak ‘PidTagConversationIndex’ özelliğini çıkaracağız.
  • Aynı ilk 22 baytlık “PidTagConversationIndex” özellik değerine sahip iletiler, aynı görüşmeye aittir. Karşılık gelen ‘ConversationThread’ sınıf örneğinin ‘Messages’ özelliği tarafından temsil edilen listeye mesaj kimliğini ekleyeceğiz.
  • “ConversationThread” örneklerinin listesini döndürür.
using Aspose.Email.Mapi;
using Aspose.Email.Storage.Pst;

public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder)
{
    // Sonuç
    var list = new List<ConversationThread>();
        
    foreach (var entryId in folder.EnumerateMessagesEntryId())
    {
        // PidTagConversationIndex özelliğini ve başlık değerini (22 bayt) çıkarın.
        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();
}

Konuşma dizisini ayrı bir dizine kaydetmek için bir yöntem oluşturun

Son olarak dizinlerdeki konuşmaları kaydedelim.

Her “ConversationThread” örneği için aşağıdakileri yapın:

  • Konu başlığının adıyla ayrı bir dizin oluşturun.
  • ConversationThread.Messages özelliğindeki tanımlayıcıları numaralandırın, her tanımlayıcı için ExtractMessage yöntemini kullanarak bir mesaj ayıklayın ve Save yöntemini kullanarak mesajı oluşturulan dizine kaydedin.
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;
    }
}

Ücretsiz API Lisansı Alın

Aspose.Email for .NET’i ücretsiz geçici lisans kullanarak değerlendirme sınırlamaları olmaksızın kullanabilirsiniz.

Çözüm

Bu makale, PST’de sohbetle ilgili mesajları aramak için Aspose.Email’in nasıl kullanılacağını göstermektedir. PidTagConversationIndex belgelerini daha fazla keşfederek, örneğin konuşma mesajlarının hiyerarşik sıralamasını ekleyerek uygulamayı karmaşıklaştırabilirsiniz. Belgeleri kullanarak Aspose.Email hakkında daha fazla bilgi edinebilirsiniz. Herhangi bir sorunuz olması durumunda forumumuza mesaj gönderebilirsiniz.

Ayrıca bakınız