Programowanie z Thunderbird

Odczyt plików MBOX

Mozilla Thunderbird jest otwarto‑źródłowym, wieloplatformowym klientem poczty elektronicznej, opracowanym przez Mozilla Foundation. Przechowuje e‑maile we własnej strukturze plików, zarządzając indeksami wiadomości i podfolderami przy użyciu własnych formatów plików. Aspose.Email może współpracować ze strukturami magazynu poczty Thunderbird. MboxrdStorageReader klasa umożliwia programistom odczyt wiadomości z pliku magazynu poczty Mozilla Thunderbird. Ten artykuł pokazuje, jak odczytać wiadomości z magazynu poczty Thunderbird:

  1. Otwórz plik magazynu Thunderbird w FileStream.
  2. Utwórz instancję MboxrdStorageReader klasa i przekaż powyższy strumień do konstruktora.
  3. Wywołaj ReadNextMessage() aby uzyskać pierwszą wiadomość.
  4. Użyj tego samego ReadNextMessage() w pętli while, aby odczytać wszystkie wiadomości.
  5. Zamknij wszystkie strumienie.

Poniższy fragment kodu pokazuje, jak odczytać wszystkie wiadomości z magazynu poczty 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();

Pobieranie właściwości wiadomości

MboxMessageInfo klasa zawiera następujące właściwości do pobierania informacji o wiadomości:

  • DateTime Date - Pobiera datę wiadomości
  • MailAddress From - Pobiera adres nadawcy
  • string Subject - Pobiera temat wiadomości
  • MailAddressCollection Do - Pobiera kolekcję adresów zawierającą odbiorców wiadomości
  • MailAddressCollection CC - Pobiera kolekcję adresów zawierającą odbiorców DW (CC)
  • MailAddressCollection Bcc - Pobiera kolekcję adresów zawierającą odbiorców ukrytych (BCC) wiadomości
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}");
}

Wyodrębnianie wiadomości z MBOX po identyfikatorach

Ten MboxStorageReader klasa zawiera EnumerateMessageInfo() metoda, która umożliwia iterację po każdej wiadomości w pliku MBOX. Korzystając z tej metody, można wyodrębnić poszczególne wiadomości bez konieczności wielokrotnego przeglądania całego magazynu. Poprawia to wydajność i skraca czas przetwarzania.

Ten MboxMessageInfo klasa udostępnia EntryId właściwość, która zapewnia dostęp do unikalnych identyfikatorów każdej wiadomości w pliku MBOX. Ten identyfikator może być przechowywany w bazie danych lub używany jako odniesienie do szybkiego znajdowania i wyodrębniania konkretnych wiadomości w razie potrzeby.

Ten ExtractMessage(string id) metoda w MboxStorageReader klasa umożliwia programistom wyodrębnianie wiadomości na podstawie ich unikalnego EntryId. Z ExtractMessage(string id) metoda, możesz wykorzystać zapisany EntryId do pobrania odpowiadającej wiadomości i wykonania dodatkowych operacji.

Poniższy przykład kodu demonstruje, jak wyodrębnić wiadomości z pliku MBOX przy użyciu identyfikatorów:

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

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

Konfigurowanie opcji ładowania przy odczycie wiadomości z MBOX

Poniższe funkcje umożliwią określenie różnych opcji związanych z ładowaniem i przetwarzaniem wiadomości:

  • Właściwość MailStorageConverter.MboxMessageOptions – pobiera lub ustawia opcje ładowania e‑maili podczas parsowania magazynu Mbox.

  • Metoda MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) – parametr EmlLoadOptions określa opcje podczas odczytu wiadomości z magazynu 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");

Ustawianie preferowanego kodowania tekstu przy ładowaniu plików Mbox do odczytu

Opcja kodowania jest dostępna dla klasy MboxrdStorageReader. Zapewnia dodatkowe opcje ładowania pliku mbox i gwarantuje, że wiadomości z zakodowaną zawartością będą prawidłowo odczytywane i przetwarzane. Poniższy fragment kodu pokazuje, jak ustawić kodowanie tekstu spełniające Twoje potrzeby:

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

Uzyskiwanie całkowitej liczby wiadomości z pliku MBOX

Ten MboxrdStorageReader klasa zapewnia możliwość odczytania liczby elementów dostępnych w pliku MBox. Może to być użyte do tworzenia aplikacji wyświetlających postęp działania podczas przetwarzania takiego pliku.

// 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());
}

Pobierz bieżący rozmiar wiadomości

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();
    }
}

Konwersja MBOX do PST z zachowaniem lub usunięciem podpisu

Aby usunąć podpis z pliku podczas procesu konwersji, ustaw MboxToPstConversionOptions.RemoveSignature ustaw właściwość na true.

Poniższy przykład kodu pokazuje, jak wykorzystać tę właściwość:

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 });

Zapisywanie plików MBOX

Ten MboxrdStorageWriter klasa zapewnia możliwość zapisywania nowych wiadomości do pliku magazynu poczty Thunderbird. Aby zapisać wiadomości:

  1. Otwórz plik magazynu Thunderbird w FileStream.
  2. Utwórz instancję MboxrdStorageWriter klasa i przekaż powyższy strumień do konstruktora.
  3. Przygotuj nową wiadomość przy użyciu MailMessage klasa.
  4. Wywołaj WriteMessage() metoda i przekazać powyższe MailMessage instancja służąca do dodania wiadomości do magazynu Thunderbird.
  5. Zamknij wszystkie strumienie.

Poniższy fragment kodu pokazuje, jak zapisać wiadomości do magazynu poczty 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();

Podziel przechowywanie MBOX/Anuluj operację dzielenia

Aspose.Email udostępnia metody do dzielenia przechowywania Mbox na mniejsze części, co ułatwia obsługę dużych archiwów e‑mail. W zależności od używanej wersji .NET dostępne metody i ich parametry mogą się różnić. Poniżej znajdują się metody MboxStorageReader klasa używana zarówno w wersjach .NET Framework 4.5 i .NET Core, jak i w wersjach poniżej 4.5.

Członkowie dla .NET Framework 4.5 i wersji .NET Core:

  • SplitInto(long chunkSize, string outputPath, CancellationToken token) - Dzieli magazyn Mbox na mniejsze części na podstawie określonego rozmiaru fragmentu.

  • Parametry:

    • chunkSize: Przybliżony rozmiar każdej części w bajtach.
    • outputPath: Ścieżka folderu, w którym zostaną utworzone części.
    • token: CancellationToken, który umożliwia ewentualne anulowanie operacji.
  • SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Dzieli magazyn Mbox na mniejsze części, z określonym prefiksem nazwy pliku dla każdej części.

  • Parametry:

    • chunkSize: Przybliżony rozmiar każdej części w bajtach.
    • outputPath: Ścieżka folderu, w którym zostaną utworzone części.
    • partFileNamePrefix: Prefiks, który zostanie dodany do nazwy pliku każdej części.
    • token: CancellationToken, który umożliwia ewentualne anulowanie operacji.

Członkowie dla wersji .NET Framework poniżej 4.5:

Poniższe przykłady kodu demonstrują, jak podzielić plik MBOX na części, ograniczając proces do maksymalnie pięciu części, wykorzystując mechanizm anulowania:

.NET Framework 4.5 i .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 poniżej 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();
};