Чтение файлов 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 class и передайте вышеуказанный поток в конструктор.
  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

Этот MboxrdStorageReader class предоставляет возможность считывать количество элементов, доступных в файле 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();
    }
}