Чтение файлов MBOX
Возможности чтения Aspose.Email
Mozilla Thunderbird это открытый кроссплатформенный почтовый клиент, разработанный Mozilla Foundation. Он хранит письма в собственной файловой структуре, управляя индексами сообщений и подпапками через собственные форматы файлов. Thunderbird создаёт один .mbox файл для каждой почтовой папки (например, Входящие, Отправленные, Корзина) и сохраняет их в каталоге профиля пользователя. Каждый файл содержит все сообщения из этой папки в конкатенированном виде.
Aspose.Email для .NET предоставляет API для чтения сообщений из .mbox файлов Thunderbird с помощью MboxrdStorageReader класс, который позволяет разработчикам:
- Открывать и читать сообщения последовательно, по одному
- Получать метаданные, такие как Тема, От, Кому, Дата и т.д., без загрузки полного содержимого
- Извлекать отдельные сообщения, используя уникальные идентификаторы (EntryId)
- Сохранять кодировку, вложения TNEF и форматирование
- Читать файлы асинхронно для лучшей производительности на больших архивах
Синхронное чтение файлов MBOX
читать сообщения из файла хранилища почты Mozilla Thunderbird. В этой статье показано, как читать сообщения из хранилища электронной почты Thunderbird:
- Откройте файл хранилища Thunderbird в FileStream.
- Создать экземпляр MboxrdStorageReader class и передайте вышеуказанный поток в конструктор.
- Вызвать ReadNextMessage() чтобы получить первое сообщение.
- Использовать тот же ReadNextMessage() в цикле while для чтения всех сообщений.
- Закрыть все потоки.
Следующий фрагмент кода показывает, как прочитать все сообщения из хранилища почты 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();
}
}