Programování s Thunderbird

Čtení MBOX souborů

Mozilla Thunderbird je open‑source, multiplatformní e‑mailový klient vyvíjený Mozilla Foundation. Ukládá e‑maily ve vlastní souborové struktuře, spravuje indexy zpráv a podadresáře pomocí proprietárních formátů souborů. Aspose.Email může pracovat se strukturami úložiště Thunderbird. MboxrdStorageReader třída umožňuje vývojářům číst zprávy ze souboru úložiště pošty Mozilla Thunderbird. Tento článek ukazuje, jak číst zprávy z úložiště e‑mailu Thunderbird:

  1. Otevřete soubor úložiště Thunderbird v FileStream.
  2. Vytvořte instanci MboxrdStorageReader třídy a předáte výše uvedený proud konstruktoru.
  3. Zavolejte ReadNextMessage() pro získání první zprávy.
  4. Použijte stejný ReadNextMessage() ve smyčce while pro načtení všech zpráv.
  5. Uzavřete všechny proudy.

Níže uvedený úryvek kódu ukazuje, jak načíst všechny zprávy z poštovního úložiště Thunderbird.

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read);
// Create an instance of the MboxrdStorageReader class and pass the stream
var reader = new MboxrdStorageReader(stream, false);
// Start reading messages
var message = reader.ReadNextMessage();

// Read all messages in a loop
while (message != null)
{
    // Manipulate message - show contents
    Console.WriteLine("Subject: " + message.Subject);
    // Save this message in EML or MSG format
    message.Save(message.Subject + ".eml", SaveOptions.DefaultEml);
    message.Save(message.Subject + ".msg", SaveOptions.DefaultMsgUnicode);

    // Get the next message
    message = reader.ReadNextMessage();
}

// Close the streams
reader.Dispose();
stream.Close();

Získávání vlastností zprávy

MboxMessageInfo třída obsahuje následující vlastnosti pro získání informací o zprávě:

  • DateTime Date - Získá datum zprávy
  • MailAddress From - Získá adresu odesílatele
  • string Subject - Získá předmět zprávy
  • MailAddressCollection To - Získá kolekci adres, která obsahuje příjemce zprávy
  • MailAddressCollection CC - Získá kolekci adres, která obsahuje CC příjemce
  • MailAddressCollection Bcc - Získá kolekci adres, která obsahuje BCC příjemce zprávy
MboxStorageReader reader = MboxStorageReader.CreateReader(fileName, new MboxLoadOptions());

foreach (var mboxMessageInfo in reader.EnumerateMessageInfo())
{
    Console.Writeline($"Subject: {mboxMessageInfo.Subject}");
    Console.Writeline($"Date: {mboxMessageInfo.Date}");
    Console.Writeline($"From: {mboxMessageInfo.From}");
    Console.Writeline($"To: {mboxMessageInfo.To}");
    Console.Writeline($"CC: {mboxMessageInfo.CC}");
    Console.Writeline($"Bcc: {mboxMessageInfo.Bcc}");
}

Extrahovat zprávy z MBOX podle identifikátorů

The MboxStorageReader třída zahrnuje EnumerateMessageInfo() metodou, která vám umožní iterovat přes každou zprávu v souboru MBOX. Použitím této metody je možné extrahovat jednotlivé zprávy bez nutnosti opakovaně procházet celé úložiště. To zvyšuje výkon a snižuje dobu zpracování.

The MboxMessageInfo třída poskytuje EntryId vlastnost, která poskytuje přístup k jedinečným identifikátorům každé zprávy v souboru MBOX. Tento identifikátor může být uložen v databázi nebo použit jako reference pro rychlé vyhledání a extrahování konkrétních zpráv podle potřeby.

The ExtractMessage(string id) metodou v MboxStorageReader třída umožňuje vývojářům extrahovat zprávy na základě jejich jedinečného EntryId. S ExtractMessage(string id) metodou můžete využít uložený EntryId k získání odpovídající zprávy a provést s ní další operace.

Následující ukázkový kód demonstruje, jak extrahovat zprávy ze souboru MBOX pomocí identifikátorů:

MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());

foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
    MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}

Konfigurace možností načítání při čtení zpráv z MBOX

Následující funkce vám umožní specifikovat různé možnosti související s načítáním a zpracováním zpráv:

  • Vlastnost MailStorageConverter.MboxMessageOptions – získává nebo nastavuje možnosti načítání e‑mailu při parsování úložiště Mbox.

  • Metoda MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) – parametr EmlLoadOptions určuje možnosti při čtení zprávy z úložiště Mbox.

var reader = new MboxrdStorageReader(fileName, new MboxLoadOptions());
// Read messages preserving tnef attachments.
var eml = reader.ReadNextMessage(new EmlLoadOptions {PreserveTnefAttachments = true});
MailStorageConverter.MboxMessageOptions(new EmlLoadOptions {PreserveTnefAttachments = true});
// Convert messages from mbox to pst preserving tnef attachments.
var pst = MailStorageConverter.mboxToPst("Input.mbox", "Output.pst");

Nastavení preferovaného kódování textu při načítání MBOX souborů pro čtení

Pro třídu MboxrdStorageReader je k dispozici volba kódování. To poskytuje další možnosti načítání souboru mbox a zajišťuje, že zprávy s kódovaným obsahem budou správně načteny a zpracovány. Následující úryvek kódu ukazuje, jak můžete nastavit kódování textu podle svých potřeb:

var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();

Získání celkového počtu zpráv ze souboru MBOX

The MboxrdStorageReader třída poskytuje možnost přečíst počet položek dostupných v souboru MBox. To lze použít při vývoji aplikací, které zobrazují průběh činnosti při zpracování takového souboru.

// The path to the File directory.
var dataDir = RunExamples.GetDataDir_Thunderbird();

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    Console.WriteLine("Total number of messages in Mbox file: " + reader.GetTotalItemsCount());
}

Získat aktuální velikost zprávy

using (var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Read))
using (var reader = new MboxrdStorageReader(stream, false))
{
    MailMessage msg;
    while ((msg = reader.ReadNextMessage()) != null)
    {
        long currentDataSize = reader.CurrentDataSize;

        msg.Dispose();
    }
}

Konverze MBOX na PST při zachování nebo odstranění podpisu

Chcete-li během konverze odstranit podpis ze souboru, nastavte MboxToPstConversionOptions.RemoveSignature nastavte vlastnost na true.

Následující ukázka kódu ukazuje, jak využít tuto vlastnost:

var pstDataStream = new MemoryStream();
var personalStorage = PersonalStorage.Create(pstDataStream, FileFormatVersion.Unicode);
MailStorageConverter.MboxToPst(new MboxrdStorageReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), new MboxLoadOptions()),
personalStorage,
    "Inbox",
new MboxToPstConversionOptions() { RemoveSignature = true });

Zápis MBOX souborů

The MboxrdStorageWriter třída poskytuje možnost zapisovat nové zprávy do souboru úložiště pošty Thunderbird. Pro zápis zpráv:

  1. Otevřete soubor úložiště Thunderbird v FileStream.
  2. Vytvořte instanci MboxrdStorageWriter třídy a předáte výše uvedený proud konstruktoru.
  3. Připravte novou zprávu pomocí MailMessage třída.
  4. Zavolejte WriteMessage() metoda a předat výše uvedené MailMessage instance pro přidání zprávy do úložiště Thunderbird.
  5. Uzavřete všechny proudy.

Následující úryvek kódu ukazuje, jak zapisovat zprávy do úložiště pošty Thunderbird.

// Open the storage file with FileStream
var stream = new FileStream(dataDir + "ExampleMbox.mbox", FileMode.Open, FileAccess.Write);

// Initialize MboxStorageWriter and pass the above stream to it
var writer = new MboxrdStorageWriter(stream, false);
// Prepare a new message using the MailMessage class
var message = new MailMessage("from@domain.com", "to@domain.com", Guid.NewGuid().ToString(), "added from Aspose.Email");
message.IsDraft = false;
// Add this message to storage
writer.WriteMessage(message);
// Close all related streams
writer.Dispose();
stream.Close();

Rozdělit úložiště MBOX/Zrušit operaci rozdělení

Aspose.Email poskytuje metody pro rozdělení úložiště Mbox na menší části, což usnadňuje práci s velkými archivy e‑mailů. V závislosti na verzi .NET, kterou používáte, se dostupné metody a jejich parametry mohou lišit. Níže jsou metody třídy MboxStorageReader třída používaná jak pro verze .NET Framework 4.5 a .NET Core, tak i pro verze pod 4.5.

Členové pro verze .NET Framework 4.5 a .NET Core:

  • SplitInto(long chunkSize, string outputPath, CancellationToken token) - Rozdělí úložiště Mbox na menší části na základě určené velikosti úseku.

  • Parametry:

    • chunkSize: Přibližná velikost každé části v bajtech.
    • outputPath: Cesta ke složce, kde budou vytvořeny části.
    • token: CancellationToken, který umožňuje případné zrušení operace.
  • SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Rozdělí úložiště Mbox na menší části s určeným předponou názvu souboru pro každou část.

  • Parametry:

    • chunkSize: Přibližná velikost každé části v bajtech.
    • outputPath: Cesta ke složce, kde budou vytvořeny části.
    • partFileNamePrefix: Předpona, která bude přidána k názvu souboru každé části.
    • token: CancellationToken, který umožňuje případné zrušení operace.

Členové pro verze .NET Framework pod 4.5:

Následující ukázky kódu demonstrují, jak rozdělit soubor MBOX na části při omezení procesu na maximálně pět částí pomocí mechanismu zrušení:

.NET Framework 4.5 a .NET Core:

int partCount = 0;

var tokenSource = new CancellationTokenSource();

var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });

// Subscribe to events
mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        tokenSource.Cancel();
};

System.Threading.Tasks.Task task = mbox.SplitInto(10000000, outputPath, tokenSource.Token);
task.Wait();

.NET Framework pod 4.5:

int partCount = 0;
var mbox = new MboxrdStorageReader(fileName, new MboxLoadOptions { LeaveOpen = false });
mbox.SplitInto(10000000, outputPath);

mbox.MboxFileCreated += (sender, e) =>
{
    partCount++;
    if (partCount >= 5)
        mbox.Cancel();
};