Programmering med Thunderbird
Läsa MBOX-filer
Mozilla Thunderbird är en öppen källkod, plattformsoberoende e‑postklient, utvecklad av Mozilla Foundation. Den lagrar e‑post i sin egen filsstruktur, hanterar meddelandeindex och undermappar via proprietära filformat. Aspose.Email kan arbeta med Thunderbirds lagringsstrukturer. MboxrdStorageReader klass låter utvecklare läsa meddelanden från Mozilla Thunderbirds lagringsfil. Denna artikel visar hur man läser meddelanden från Thunderbird e-postlagring:
- Öppna Thunderbirds lagringsfil i FileStream.
- Skapa en instans av MboxrdStorageReader klassen och skicka den ovanstående strömmen till konstruktorn.
- Anropa ReadNextMessage() för att hämta det första meddelandet.
- Använd samma ReadNextMessage() i en while‑loop för att läsa alla meddelanden.
- Stäng alla strömmar.
Följande kodsnutt visar hur du läser alla meddelanden från Thunderbirds e‑postlagring.
// 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();
Hämta meddelandeegenskaper
MboxMessageInfo klass innehåller följande egenskaper för att hämta information om ett meddelande:
- DateTime Datum - Hämtar datumet för meddelandet
- MailAddress Från - Hämtar avsändaradressen
- string Ämne - Hämtar meddelandets ämne
- MailAddressCollection Till - Hämtar adresssamlingen som innehåller mottagarna av meddelandet
- MailAddressCollection CC - Hämtar adresssamlingen som innehåller CC-mottagare
- MailAddressCollection Bcc - Hämtar adresssamlingen som innehåller BCC-mottagare av meddelandet
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}");
}
Extrahera meddelanden från MBOX med identifierare
Den MboxStorageReader klass innehåller EnumerateMessageInfo() metod, som låter dig iterera igenom varje meddelande i en MBOX-fil. Genom att använda denna metod blir det möjligt att extrahera enskilda meddelanden utan att behöva gå igenom hela lagringen upprepade gånger. Detta förbättrar prestanda och minskar bearbetningstid.
Den MboxMessageInfo klass tillhandahåller EntryId egenskap, som ger åtkomst till unika identifierare för varje meddelande i MBOX-filen. Denna identifierare kan lagras i en databas eller användas som referens för att snabbt hitta och extrahera specifika meddelanden när det behövs.
Den ExtractMessage(string id) metod i MboxStorageReader klass möjliggör för utvecklare att extrahera meddelanden baserat på deras unika EntryId. Med ExtractMessage(string id) metod kan du utnyttja det lagrade EntryId för att hämta motsvarande meddelande och utföra ytterligare operationer med det.
Följande kodexempel visar hur man extraherar meddelanden från en MBOX-fil med hjälp av identifierare:
MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());
foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}
Konfigurera läsalternativen när meddelanden läses från MBOX
Följande funktioner låter dig ange olika alternativ relaterade till inläsning och bearbetning av meddelanden:
-
MailStorageConverter.MboxMessageOptions-egenskapen - Hämtar eller anger e-postläsningsalternativ när Mbox-lagring parsas.
-
Metoden MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - parametern EmlLoadOptions anger alternativ när meddelande läses från Mbox-lagring.
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");
Ställa in föredragen teckenkodning vid inläsning av MBOX‑filer för läsning
Kodningsalternativ är tillgängligt för MboxrdStorageReader-klassen. Detta ger extra alternativ för att läsa in mbox-filen och säkerställer att meddelanden med kodade innehåll läses korrekt och bearbetas. Följande kodsnutt visar hur du kan ställa in textkodning som uppfyller dina behov:
var reader = new MboxrdStorageReader("sample.mbox", new MboxLoadOptions() { PreferredTextEncoding = Encoding.UTF8});
var message = reader.ReadNextMessage();
Hämta totalt antal meddelanden från MBOX-fil
Den MboxrdStorageReader klassen ger möjlighet att läsa antalet objekt som finns i en MBox‑fil. Detta kan användas för att utveckla applikationer som visar aktivitetsförloppet under bearbetning av en sådan fil.
// 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());
}
Hämta aktuell meddelandestorlek
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();
}
}
Konvertera MBOX till PST med eller utan att bevara signatur
För att ta bort signaturen från en fil under konverteringsprocessen, sätt MboxToPstConversionOptions.RemoveSignature egenskap till true.
Följande kodexempel visar hur man använder denna egenskap:
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 });
Skriva MBOX-filer
Den MboxrdStorageWriter klass möjliggör att skriva nya meddelanden till Thunderbirds lagringsfil. För att skriva meddelanden:
- Öppna Thunderbirds lagringsfil i FileStream.
- Skapa en instans av MboxrdStorageWriter klassen och skicka den ovanstående strömmen till konstruktorn.
- Förbered ett nytt meddelande med hjälp av MailMessage klass.
- Anropa WriteMessage() metod och skicka ovanstående MailMessage instans för att lägga till meddelandet i Thunderbirds lagring.
- Stäng alla strömmar.
Följande kodsnutt visar hur du skriver meddelanden till Thunderbirds e-postlagring.
// 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();
Dela MBOX-lagring/Avbryt delningsoperation
Aspose.Email tillhandahåller metoder för att dela upp Mbox-lagring i mindre delar, vilket gör det lättare att hantera stora e-postarkiv. Beroende på vilken .NET-version du använder kan de tillgängliga metoderna och deras parametrar variera. Nedan är metoderna för MboxStorageReader klass som används för både .NET Framework 4.5 och .NET Core-versioner samt för versioner under 4.5.
Medlemmar för .NET Framework 4.5 och .NET Core-versioner:
-
SplitInto(long chunkSize, string outputPath, CancellationToken token) – Delar Mbox‑lagringen i mindre delar baserat på den angivna delstorleken.
-
Parametrar:
- chunkSize: Den ungefärliga storleken på varje del i byte.
- outputPath: Mappvägen där delarna kommer att skapas.
- token: En CancellationToken som möjliggör eventuell avbrytning av operationen.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) – Delar Mbox‑lagringen i mindre delar med ett angivet filnamnsprefix för varje del.
-
Parametrar:
- chunkSize: Den ungefärliga storleken på varje del i byte.
- outputPath: Mappvägen där delarna kommer att skapas.
- partFileNamePrefix: Prefixet som ska läggas till filnamnet för varje del.
- token: En CancellationToken som möjliggör eventuell avbrytning av operationen.
Medlemmar för .NET Framework-versioner under 4.5:
-
SplitInto(long chunkSize, string outputPath) – Delar Mbox‑lagringen i mindre delar baserat på den angivna delstorleken.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) – Delar Mbox‑lagringen i mindre delar med ett angivet filnamnsprefix för varje del.
-
Cancel() – Avbryter en pågående delningsoperation.
Följande kodexempel visar hur man delar en MBOX‑fil i delar samtidigt som processen begränsas till högst fem delar, med hjälp av en avbrytningmekanism:
.NET Framework 4.5 och .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 under 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();
};