Читання файлів MBOX

Можливості читання Aspose.Email

Mozilla Thunderbird це відкритий, крос‑платформений клієнт електронної пошти, розроблений Mozilla Foundation. Він зберігає листи у власній файловій структурі, керуючи індексами повідомлень та підпапками за допомогою пропрієтарних форматів файлів. Thunderbird створює один .mbox файл для кожної папки електронної пошти (наприклад, Вхідні, Надіслані, Видалені) і зберігає ці файли в каталозі профілю користувача. Кожен файл містить усі повідомлення з цієї папки у злитій формі.

Aspose.Email для .NET надає API для читання повідомлень з .mbox файлів Thunderbird, використовуючи MboxrdStorageReader клас, який дозволяє розробникам:

  • Відкривати та читати повідомлення послідовно, по одному
  • Отримати метадані, такі як Тема, Від, Кому, Дата тощо, без завантаження повного вмісту
  • Витягнути окремі повідомлення, використовуючи унікальні ідентифікатори (EntryId)
  • Зберігати кодування, вкладення TNEF та форматування
  • Читати файли асинхронно для кращої продуктивності на великих архівах

Синхронне читання MBOX файлів

читати повідомлення з файлу сховища пошти Mozilla Thunderbird. У цій статті показано, як читати повідомлення зі сховища електронної пошти Thunderbird:

  1. Відкрийте файл сховища Thunderbird у FileStream.
  2. Створіть екземпляр MboxrdStorageReader класу і передайте вищезгаданий потік у конструктор.
  3. Викличте ReadNextMessage() щоб отримати перше повідомлення.
  4. Використайте той самий ReadNextMessage() у циклі while, щоб прочитати всі повідомлення.
  5. Закрийте всі потоки.

Наведений фрагмент коду показує, як прочитати всі повідомлення зі сховища пошти 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();

Асинхронне читання MBOX файлів

Щоб підвищити продуктивність та швидкість реакції при обробці великих MBOX файлів, Aspose.Email для .NET забезпечує асинхронне читання MBOX через CreateReaderAsync метод. Ця можливість особливо корисна в застосунках, які обробляють великі архіви електронної пошти або виконують операції, пов’язані з ввід/вивід, у фонових потоках або веб‑службах. Нижчеподаний приклад коду демонструє, як асинхронно читати електронні повідомлення з MBOX файлу за допомогою читача сховища Aspose.Email:

string mboxFilePath = "emails.mbox";

    // Create a reader for the MBOX file asynchronously
    using (var reader = await MboxrdStorageReader.CreateReaderAsync(mboxFilePath, CancellationToken.None))
    {
    Console.WriteLine("MBOX reader initialized.");

    // Read messages from the MBOX file
        while (reader.ReadNextMessage() is var message && message != null)
        {
            Console.WriteLine($"Subject: {message.Subject}");
        }
    }

Читати електронні повідомлення пакетами з підтримкою пагінації

Отримайте посторінковий доступ до повідомлень, збережених у файлах поштових скриньок. Ця можливість дозволяє розробникам ефективніше обробляти великі архіви електронної пошти, отримуючи повідомлення меншими порціями — покращуючи продуктивність та зменшуючи навантаження на пам’ять. Використовуйте наступні методи MboxStorageReader клас:

  • EnumerateMessages(int startIndex, int count) - Повертає перелічувану колекцію екземплярів MailMessage, починаючи з вказаного індексу та обмежену заданою кількістю.

  • EnumerateMessageInfo(int startIndex, int count) - Повертає перелічувану колекцію об’єктів MboxMessageInfo лише з метаданими, також посторінково за індексом та кількістю.

Нижченаведений приклад коду демонструє, як читати певний діапазон повідомлень із поштового архіву, визначивши початковий індекс і розмір пакету. У прикладі метод отримує 10 повідомлень, починаючи з індексу 0.

using Aspose.Email.Storage.Mbox;
using Aspose.Email;

var reader = MboxStorageReader.CreateReader("input.mbox", new MboxLoadOptions());
int startIndex = 0;
int count = 10; // Retrieve messages in batches of 10

foreach (var message in reader.EnumerateMessages(startIndex, count))
{
    Console.WriteLine("Subject: " + message.Subject);
}

Встановити бажане кодування тексту при завантаженні MBOX файлів для читання

Опція кодування доступна для MboxrdStorageReader клас. Це забезпечує додаткові параметри завантаження файлу mbox і гарантує, що повідомлення з закодованим вмістом будуть правильно прочитані та оброблені. Наведений нижче фрагмент коду показує, як можна встановити кодування тексту, що відповідає вашим потребам:

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

Отримати загальну кількість повідомлень у файлах MBOX

The MboxrdStorageReader клас забезпечує можливість читати кількість елементів, доступних у файлі MBox. Це можна використати для розробки застосунків, які показують прогрес дії під час обробки такого файлу.

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

Отримати поточний розмір повідомлення

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