Программирование с Thunderbird
Чтение файлов MBOX
Mozilla Thunderbird — это клиент электронной почты с открытым исходным кодом и кроссплатформенной поддержкой, разработанный фондом Mozilla. Он хранит электронные письма в собственной файловой структуре, управляя индексами сообщений и подпапками через собственные форматы файлов. Aspose.Email может работать со структурами хранения почты Thunderbird. Класс MboxrdStorageReader позволяет разработчикам читать сообщения из файла хранения электронной почты Mozilla Thunderbird. В этой статье показано, как читать сообщения из хранилища электронной почты Thunderbird:
- Откройте файл хранения Thunderbird в FileStream.
- Создайте экземпляр класса MboxrdStorageReader и передайте вышеуказанный поток в конструктор.
- Вызовите 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 предоставляет свойство 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 предоставляет возможность прочитать количество элементов, доступных в файле 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 и передайте вышеуказанный поток в конструктор.
- Подготовьте новое сообщение с помощью класса 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();