Програмування з Thunderbird

Читання MBOX файлів

Mozilla Thunderbird — це відкритий, крос‑платформений клієнт електронної пошти, розроблений Mozilla Foundation. Він зберігає листи у власній файловій структурі, керуючи індексами повідомлень та підпапками за допомогою пропрієтарних форматів файлів. Aspose.Email може працювати зі структурами сховища пошти Thunderbird. The MboxrdStorageReader клас дозволяє розробникам читати повідомлення з файлу сховища пошти Mozilla Thunderbird. У цій статті показано, як читати повідомлення зі сховища Thunderbird:

  1. Відкрийте файл сховища Thunderbird у FileStream.
  2. Створіть екземпляр MboxrdStorageReader класу і передайте вищезгаданий потік у конструктор.
  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();

Отримання властивостей повідомлення

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. Щоб записати повідомлення:

  1. Відкрийте файл сховища Thunderbird у FileStream.
  2. Створіть екземпляр MboxrdStorageWriter класу і передайте вищезгаданий потік у конструктор.
  3. Підготуйте нове повідомлення за допомогою MailMessage клас.
  4. Викличте WriteMessage() метод і передайте вищезазначене MailMessage екземпляр для додавання повідомлення у сховище Thunderbird.
  5. Закрийте всі потоки.

Наступний фрагмент коду показує, як записувати повідомлення у сховище пошти 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:

Наведені нижче зразки коду демонструють, як розділити файл 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();
};