Přečtěte si soubory MS Outlook PST v C# .NET

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

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řídy ConversationThread.
  • 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.

Viz také