
Ein Konversationsstrang ist eine Folge von Antworten auf eine Nachricht mit einem gemeinsamen Thema. Nachrichten innerhalb einer Konversation können auf verschiedene Weise angezeigt werden, z.B. in hierarchischer oder chronologischer Reihenfolge. Um einen Nachrichtenstrang anzuzeigen, identifizieren E-Mail-Anwendungen die Nachrichtenantworten. Die beliebtesten E-Mail-Dateiformate bieten diese Funktion.
Konversationsstränge ermöglichen es den Lesern, die gesamte Struktur eines Gesprächs schnell zu verstehen, bestimmte Punkte von Gesprächen hervorzuheben und wichtige Informationen zu analysieren.
In diesem Artikel konzentrieren wir uns auf die Verwendung der PST/MAPI-Funktionen von Aspose.Email, um Nachrichten nach Konversationen zu finden und zu gruppieren. Dazu implementieren wir einen Beispielcode, der die Nachrichten in einem bestimmten Ordner durchläuft, sie nach Konversation gruppiert und dann jede Konversation in einem separaten Verzeichnis auf der Festplatte speichert.
- MAPI-Eigenschaften, die zur Unterstützung des Konversationsstrangs verwendet werden
- C# .NET API zum Lesen von Outlook PST-Dateien
- Nachrichten in PST nach Konversationsstrang gruppieren
MAPI-Eigenschaften, die zur Unterstützung des Konversationsstrangs verwendet werden
Da Nachrichten in PST als eine Reihe von MAPI-Eigenschaften gespeichert sind, müssen wir die MAPI-Eigenschaften definieren, die mit dem Sammeln von Nachrichtenantworten verbunden sind.
Dies wird im Microsoft-Dokumentationsbereich beschrieben.
Wie zu sehen ist, ermöglicht die PidTagConversationIndex-Eigenschaft eine genaue Bestimmung, ob eine Nachricht mit einer bestimmten Konversation verbunden ist oder nicht. Die Eigenschaft zeigt auch die relative Nachrichtenposition innerhalb eines Konversationsstrangs an. Besuchen Sie die Seite für weitere Informationen zur PidTagConversationIndex
-Eigenschaft. Der Header sind die ersten 22 Bytes des Wertes der PidTagConversationIndex
-Eigenschaft. Es handelt sich um einen Datenabschnitt, um festzustellen, ob die Nachricht zu einem bestimmten Konversationsstrang gehört.
C# .NET API zum Lesen von Outlook PST-Dateien
Um PST-Dateien zu lesen, verwenden wir Aspose.Email für .NET. Es ist eine erstaunliche Bibliothek zur Implementierung von E-Mail-Verarbeitungsanwendungen mit .NET. Mit der Bibliothek können Sie eine Vielzahl von verschiedenen E-Mail-Dateiformaten einfach handhaben. Sie können Aspose.Email für .NET über NuGet installieren oder seine DLL herunterladen.
PM> Install-Package Aspose.Email
Nachrichten in PST nach Konversationsstrang gruppieren
Um die Nachrichten in PST nach Konversationen zu gruppieren, benötigen wir Folgendes:
- Zuerst erstellen wir eine
ConversationThread
-Klasse. Sie ist ein Container, um die Nachrichten innerhalb einer Konversation zu gruppieren. - Dann erstellen wir eine Methode zur Suche und Gruppierung von Nachrichten nach der Konversation.
- Schließlich erstellen wir eine Methode, um den Konversationsstrang in einem separaten Verzeichnis zu speichern.
Erstellen einer ConversationThread-Klasse
Sie wird die folgenden Eigenschaften haben.
Id
: String-Darstellung des Konversationsindex-Headers (22 Bytes).Messages
: Liste der Nachrichten-IDs, die sich im Konversationsstrang befinden.
/// <summary> | |
/// Represents messages within a conversation thread. | |
/// </summary> | |
public class ConversationThread | |
{ | |
private string id; | |
private List<string> messages; | |
/// <summary> | |
/// Initializes a new instance of the <see cref="ConversationThread"/> class. | |
/// </summary> | |
/// <param name="id">The string representation of conversation index header.</param> | |
public MessageThread(string id) | |
{ | |
this.id = id; | |
this.messages = new List<string>(); | |
} | |
/// <summary> | |
/// Gets or sets the HEX string representation of conversation index header (22 bytes). | |
/// </summary> | |
public string Id { get => id; set => id = value; } | |
/// <summary> | |
/// Gets a list of message IDs that are within a conversation thread. | |
/// </summary> | |
public List<string> Messages { get => messages; } | |
} |
Erstellen einer Methode zur Suche und Gruppierung von Nachrichten nach Konversation
Nachdem wir die ConversationThread
-Klasse erstellt haben, können wir uns darauf konzentrieren, eine Methode zu schreiben, die Folgendes tut:
- Gehen Sie alle Nachrichten im Ordner durch. Aus Leistungsgründen lesen wir nur die Nachrichten-ID mithilfe der EnumerateMessagesEntryId-Methode.
- Für jede Nachricht extrahieren wir die
PidTagConversationIndex
-Eigenschaft mit der ExtractProperty-Methode. - Nachrichten, die die gleichen ersten 22 Bytes des Wertes der
PidTagConversationIndex
-Eigenschaft haben, gehören zur gleichen Konversation. Wir fügen die Nachrichten-ID zur Liste hinzu, die durch dieMessages
-Eigenschaft der entsprechendenConversationThread
-Klasseninstanz dargestellt wird. - Geben Sie die Liste der
ConversationThread
-Instanzen zurück.
using Aspose.Email.Mapi; | |
using Aspose.Email.Storage.Pst; | |
public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder) | |
{ | |
// Result | |
var list = new List<ConversationThread>(); | |
foreach (var entryId in folder.EnumerateMessagesEntryId()) | |
{ | |
// Extract PidTagConversationIndex property and its header value (22 bytes). | |
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(); | |
} |
Erstellen einer Methode zum Speichern des Konversationsstrangs in einem separaten Verzeichnis
Letztendlich lassen Sie uns die Konversationen in den Verzeichnissen speichern.
Für jede ConversationThread
-Instanz tun Sie Folgendes:
- Erstellen Sie ein separates Verzeichnis mit dem Namen des Themenstrangs.
- Durchlaufen Sie die Identifikatoren in der
ConversationThread.Messages
-Eigenschaft, extrahieren Sie für jeden Identifikator eine Nachricht mithilfe der ExtractMessage-Methode und speichern Sie die Nachricht im erstellten Verzeichnis mit der Save-Methode.
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; | |
} | |
} |
Holen Sie sich eine kostenlose API-Lizenz
Sie können Aspose.Email für .NET ohne Evaluierungsbeschränkungen mit einer kostenlosen temporären Lizenz verwenden.
Fazit
Dieser Artikel zeigt, wie man Aspose.Email verwendet, um nach konversationsbezogenen Nachrichten in PST zu suchen. Durch die weitere Erkundung der PidTagConversationIndex-Dokumentation können Sie die Implementierung auch komplizieren, indem Sie beispielsweise die hierarchische Sortierung der Konversationsnachrichten hinzufügen. Sie können mehr über Aspose.Email in der Dokumentation erfahren. Wenn Sie Fragen haben, können Sie in unserem Forum posten.