Vlákno konverzace je sekvence odpovědí na zprávu se společným tématem vlákna. Zprávy v rámci konverzace lze zobrazit různými způsoby, například v hierarchickém nebo chronologickém pořadí. Chcete-li zobrazit vlákno zpráv, e-mailové aplikace identifikují odpovědi na zprávy. Tuto funkci poskytují nejoblíbenější formáty e-mailových souborů. Vlákna konverzace umožňují čtenářům rychle porozumět celkové struktuře konverzace, zvýraznit určité body konverzace a analyzovat důležité informace. V tomto článku se zaměříme na používání funkcí PST/MAPI Aspose.Email k vyhledávání a seskupování zpráv podle konverzace. Za tímto účelem implementujeme ukázkový kód, který bude procházet zprávy v dané složce, seskupit je podle konverzace a poté každou konverzaci uložit do samostatného adresáře na disku.
- Vlastnosti MAPI, které se používají k podpoře vlákna konverzace
- C# .NET API pro čtení souborů PST aplikace Outlook
- Seskupte zprávy v PST podle vlákna konverzace
Vlastnosti MAPI, které se používají k podpoře vlákna konverzace
Protože zprávy v pst jsou uloženy jako sada vlastností MAPI, musíme definovat vlastnosti MAPI, které jsou spojeny se shromažďováním odpovědí na zprávy.
To je popsáno v části Dokumenty Microsoft.
Jak je vidět, vlastnost PidTagConversationIndex umožňuje přesně určit, zda je zpráva spojena s určitou konverzací nebo ne. Tato vlastnost také označuje relativní pozici zprávy v rámci vlákna konverzace. Navštivte stránku pro více informací o vlastnosti PidTagConversationIndex
. Záhlaví je prvních 22 bajtů hodnoty vlastnosti PidTagConversationIndex
. Jde o datovou část, která určuje, zda zpráva patří do určitého vlákna konverzace.
C# .NET API pro čtení souborů PST aplikace Outlook
Ke čtení souborů PST použijeme Aspose.Email for .NET. Je to úžasná knihovna pro implementaci aplikací pro zpracování e-mailů pomocí .NET. Pomocí knihovny můžete snadno pracovat s mnoha různými formáty e-mailových souborů. Aspose.Email pro .NET můžete nainstalovat přes NuGet nebo stáhnout jeho DLL.
PM> Install-Package Aspose.Email
Seskupte zprávy v PST podle vlákna konverzace
K seskupení zpráv v PST podle konverzací potřebujeme následující:
- Nejprve vytvořte třídu
ConversationThread
. Je to kontejner pro seskupení zpráv v rámci konverzace. - Poté vytvořte metodu pro vyhledávání a seskupování zpráv podle konverzace.
- Nakonec vytvořte metodu pro uložení vlákna konverzace do samostatného adresáře.
Vytvořte třídu ConversationThread
Bude mít následující vlastnosti.
Id
: řetězcová reprezentace hlavičky indexu konverzace (22 bajtů).Zprávy
: seznam ID zpráv, které jsou ve vláknu konverzace.
///<summary>
/// Představuje zprávy v rámci vlákna konverzace.
///</summary>
public class ConversationThread
{
private string id;
private List<string> messages;
///<summary>
/// Inicializuje novou instanci souboru<see cref="ConversationThread"/> třída.
///</summary>
///<param name="id"> Řetězcová reprezentace hlavičky indexu konverzace.</param>
public MessageThread(string id)
{
this.id = id;
this.messages = new List<string>();
}
///<summary>
/// Získá nebo nastaví reprezentaci HEX řetězce záhlaví indexu konverzace (22 bajtů).
///</summary>
public string Id { get => id; set => id = value; }
///<summary>
/// Získá seznam ID zpráv, které jsou v rámci vlákna konverzace.
///</summary>
public List<string> Messages { get => messages; }
}
Vytvořte metodu pro vyhledávání a seskupování zpráv podle konverzace
Po vytvoření třídy ConversationThread
se můžeme zaměřit na psaní metody, která dělá následující:
- Projděte všechny zprávy ve složce. Z důvodů výkonu budeme číst identifikátor zprávy pouze pomocí metody EnumerateMessagesEntryId.
- Pro každou zprávu extrahujeme vlastnost
PidTagConversationIndex
pomocí metody ExtractProperty. - Zprávy, které mají stejných prvních 22 bajtů hodnoty vlastnosti
PidTagConversationIndex
, patří do stejné konverzace. Přidáme ID zprávy do seznamu reprezentovaného vlastnostíMessages
odpovídající instance třídyConversationThread
. - Vraťte seznam instancí
ConversationThread
.
using Aspose.Email.Mapi;
using Aspose.Email.Storage.Pst;
public List<ConversationThread> GroupMessagesByThread(PersonalStorage pst, FolderInfo folder)
{
// Výsledek
var list = new List<ConversationThread>();
foreach (var entryId in folder.EnumerateMessagesEntryId())
{
// Extrahujte vlastnost PidTagConversationIndex a její hodnotu záhlaví (22 bajtů).
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();
}
Vytvořte metodu pro uložení vlákna konverzace do samostatného adresáře
Nakonec uložíme konverzace do adresářů.
Pro každou instanci ConversationThread
proveďte následující:
- Vytvořte samostatný adresář s názvem tématu vlákna.
- Vyjmenujte identifikátory ve vlastnosti
ConversationThread.Messages
, pro každý identifikátor extrahujte zprávu pomocí metody ExtractMessage a uložte zprávu do vytvořeného adresáře pomocí metody 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;
}
}
Získejte bezplatnou licenci API
Aspose.Email pro .NET můžete používat bez omezení hodnocení pomocí bezplatné dočasné licence.
Závěr
Tento článek ukazuje, jak používat Aspose.Email k vyhledávání zpráv souvisejících s konverzací v PST. Dalším prozkoumáním dokumentace PidTagConversationIndex můžete implementaci také zkomplikovat přidáním například hierarchického řazení konverzačních zpráv. Více o Aspose.Email se můžete dozvědět pomocí dokumentace. Máte-li nějaké dotazy, můžete je zveřejnit na našem fóru.