Программирование с Thunderbird
Чтение файлов MBOX
Mozilla Thunderbird является открытым, кросс‑платформенным почтовым клиентом, разработанным Mozilla Foundation. Он хранит электронные письма в собственной файловой структуре, управляя индексами сообщений и подпапками через проприетарные форматы файлов. Aspose.Email может работать со структурами хранилища почты Thunderbird. The MboxrdStorageReader класс позволяет разработчикам читать сообщения из файла хранилища почты 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();
Получение свойств сообщения
MboxMessageInfo класс содержит следующие свойства для получения информации о сообщении:
- DateTime Date - Получает дату сообщения
- MailAddress From - Получает адрес отправителя
- string Subject - Получает тему сообщения
- MailAddressCollection To - Получает коллекцию адресов, содержащую получателей сообщения
- MailAddressCollection CC - Получает коллекцию адресов, содержащую получателей CC
- MailAddressCollection Bcc - Получает коллекцию адресов, содержащую получателей BCC сообщения
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}");
}
Извлечение сообщений из MBOX по идентификаторам
Этот MboxStorageReader класс включает EnumerateMessageInfo() метод, который позволяет проходить по каждому сообщению в файле MBOX. Используя этот метод, можно извлекать отдельные сообщения без необходимости многократно обходить всё хранилище. Это повышает производительность и уменьшает время обработки.
Этот MboxMessageInfo class предоставляет EntryId свойства, которое предоставляет доступ к уникальным идентификаторам каждого сообщения в файле MBOX. Этот идентификатор можно хранить в базе данных или использовать как ссылку для быстрого поиска и извлечения конкретных сообщений при необходимости.
Этот ExtractMessage(string id) метода в MboxStorageReader класс позволяет разработчикам извлекать сообщения на основе их уникального EntryId. С помощью ExtractMessage(string id) методом вы можете использовать сохранённый EntryId для получения соответствующего сообщения и выполнения дополнительных операций с ним.
Следующий пример кода демонстрирует, как извлекать сообщения из файла MBOX с использованием идентификаторов:
MboxStorageReader reader = MboxStorageReader.CreateReader("my.mbox", new MboxLoadOptions());
foreach (MboxMessageInfo msgInfo in reader.EnumerateMessageInfo())
{
MailMessage eml = reader.ExtractMessage(msgInfo.EntryId, new EmlLoadOptions());
}
Настройка параметров загрузки при чтении сообщений из MBOX
Следующие функции позволят указать различные параметры, связанные с загрузкой и обработкой сообщений:
-
Свойство MailStorageConverter.MboxMessageOptions - получает или задает параметры загрузки электронной почты при разборе хранилища Mbox.
-
Метод MboxrdStorageReader.ReadNextMessage(EmlLoadOptions options) - параметр EmlLoadOptions задает параметры при чтении сообщения из хранилища 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");
Установка предпочтительной кодировки текста при загрузке файлов 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();
}
}
Конвертация MBOX в PST с сохранением или удалением подписи
Чтобы удалить подпись из файла во время процесса конвертации, установите MboxToPstConversionOptions.RemoveSignature свойство в true.
Следующий пример кода демонстрирует, как использовать это свойство:
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 });
Запись файлов MBOX
Этот MboxrdStorageWriter класс предоставляет возможность записывать новые сообщения в файл хранилища почты Thunderbird. Чтобы записать сообщения:
- Откройте файл хранилища Thunderbird в FileStream.
- Создать экземпляр MboxrdStorageWriter class и передайте вышеуказанный поток в конструктор.
- Подготовьте новое сообщение, используя MailMessage класс.
- Вызвать WriteMessage() метод и передать вышеуказанное MailMessage экземпляр для добавления сообщения в хранилище Thunderbird.
- Закрыть все потоки.
Следующий фрагмент кода показывает, как записать сообщения в хранилище почты 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();
Разделить хранилище MBOX/Отменить операцию разбивки
Aspose.Email предоставляет методы для разбиения хранилища Mbox на более мелкие части, упрощая работу с большими архивами электронной почты. В зависимости от используемой версии .NET доступные методы и их параметры могут различаться. Ниже представлены методы MboxStorageReader класс используется как для .NET Framework 4.5 и версий .NET Core, так и для версий ниже 4.5.
Члены для .NET Framework 4.5 и версий .NET Core:
-
SplitInto(long chunkSize, string outputPath, CancellationToken token) - Разделяет хранилище Mbox на более мелкие части в соответствии с указанным размером блока.
-
Параметры:
- chunkSize: Приблизительный размер каждой части в байтах.
- outputPath: Путь к папке, в которой будут созданы части.
- token: CancellationToken, позволяющий при необходимости отменить операцию.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix, CancellationToken token) - Разделяет хранилище Mbox на более мелкие части с указанным префиксом имени файла для каждой части.
-
Параметры:
- chunkSize: Приблизительный размер каждой части в байтах.
- outputPath: Путь к папке, в которой будут созданы части.
- partFileNamePrefix: Префикс, который будет добавлен к имени файла каждой части.
- token: CancellationToken, позволяющий при необходимости отменить операцию.
Члены для версий .NET Framework ниже 4.5:
-
SplitInto(long chunkSize, string outputPath) - Разделяет хранилище Mbox на более мелкие части в соответствии с указанным размером блока.
-
SplitInto(long chunkSize, string outputPath, string partFileNamePrefix) - Разделяет хранилище Mbox на более мелкие части с указанным префиксом имени файла для каждой части.
-
Cancel() — прерывает текущую операцию разделения.
Ниже приведённые примеры кода демонстрируют, как разбить файл MBOX на части, ограничив процесс максимум пятью частями, используя механизм отмены:
.NET Framework 4.5 и .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 ниже 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();
};