Програмиране с Thunderbird

Четене на MBOX файлове

Mozilla Thunderbird е отворен код, крос‑платформен имейл клиент, разработен от Mozilla Foundation. Той съхранява имейли в собствена файловата структура, управлявайки индекси на съобщения и подпапки чрез проприетарни файлови формати. Aspose.Email може да работи със структури на хранилището на Thunderbird. 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 по идентификатори

Този 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. За записване на съобщения:

  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();
};