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:
- Otevřete soubor úložiště Thunderbird v FileStream.
- Vytvořte instanci MboxrdStorageReader třídy a předáte výše uvedený proud konstruktoru.
- Zavolejte ReadNextMessage() pro získání první zprávy.
- Použijte stejný ReadNextMessage() ve smyčce while pro načtení všech zpráv.
- 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:
- Otevřete soubor úložiště Thunderbird v FileStream.
- Vytvořte instanci MboxrdStorageWriter třídy a předáte výše uvedený proud konstruktoru.
- Připravte novou zprávu pomocí MailMessage třída.
- Zavolejte WriteMessage() metoda a předat výše uvedené MailMessage instance pro přidání zprávy do úložiště Thunderbird.
- 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:
-
SplitInto(long chunkSize, string outputPath) - Rozdělí úložiště Mbox na menší části na základě určené velikosti úseku.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - Rozdělí úložiště Mbox na menší části s určeným předponou názvu souboru pro každou část.
-
Cancel() – Přeruší probíhající operaci rozdělování.
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();
};