Програмування з Thunderbird
Читання MBOX файлів
Mozilla Thunderbird — це відкритий, крос‑платформений клієнт електронної пошти, розроблений Mozilla Foundation. Він зберігає листи у власній файловій структурі, керуючи індексами повідомлень та підпапками за допомогою пропрієтарних форматів файлів. Aspose.Email може працювати зі структурами сховища пошти Thunderbird. The 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 До - Повертає колекцію адрес, що містить одержувачів повідомлення
- 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 за ідентифікаторами
The MboxStorageReader клас включає EnumerateMessageInfo() метод, який дозволяє перебирати кожне повідомлення у MBOX файлі. Використовуючи цей метод, можна витягнути окремі повідомлення без необхідності багаторазово проходити весь файл. Це підвищує продуктивність і зменшує час обробки.
The MboxMessageInfo class надає EntryId властивість, яка забезпечує доступ до унікальних ідентифікаторів кожного повідомлення у MBOX файлі. Цей ідентифікатор можна зберігати в базі даних або використовувати як посилання для швидкого пошуку та витягування потрібних повідомлень.
The 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 файлi
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();
}
}
Конвертація 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 файлів
The 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();
Розділити сховище 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();
};