读取 MBOX 文件

Aspose.Email 读取功能

Mozilla Thunderbird 是由 Mozilla 基金会开发的开源跨平台电子邮件客户端。它使用自己的文件结构存储电子邮件,通过专有文件格式管理消息索引和子文件夹。Thunderbird 为每个邮箱文件夹(例如收件箱、已发送、垃圾箱)创建一个 .mbox 文件,并将这些文件存放在用户的配置文件目录中。每个文件以串联形式包含该文件夹的所有消息。

Aspose.Email for .NET 提供了使用以下方式读取 Thunderbird .mbox 文件中消息的 API MboxrdStorageReader 类,允许开发者:

  • 顺序打开并读取消息,一次一个
  • 检索主题、发件人、收件人、日期等元数据,而无需加载完整内容
  • 使用唯一标识符(EntryId)提取单个消息
  • 保留编码、TNEF 附件和格式
  • 异步读取文件,以在大型存档上获得更佳性能

同步读取 MBOX 文件

读取 Mozilla Thunderbird 邮件存储文件中的消息。本文展示了如何从 Thunderbird 邮件存储中读取消息:

  1. FileStream 中打开 Thunderbird 存储文件。
  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();

异步读取 MBOX 文件

为了在处理大型 MBOX 文件时提升性能和响应能力,Aspose.Email for .NET 提供了通过以下方式的异步 MBOX 读取 CreateReaderAsync 方法。此功能在处理大型电子邮件存档或在后台线程/Web 服务中运行 I/O 密集型操作的应用程序中特别有用。以下代码示例演示了如何使用 Aspose.Email 存储读取器异步读取 MBOX 文件中的电子邮件消息:

string mboxFilePath = "emails.mbox";

    // Create a reader for the MBOX file asynchronously
    using (var reader = await MboxrdStorageReader.CreateReaderAsync(mboxFilePath, CancellationToken.None))
    {
    Console.WriteLine("MBOX reader initialized.");

    // Read messages from the MBOX file
        while (reader.ReadNextMessage() is var message && message != null)
        {
            Console.WriteLine($"Subject: {message.Subject}");
        }
    }

批量读取电子邮件消息并支持分页

获取对存储在邮箱文件中的消息的分页访问。此功能使开发者能够通过以较小的批次检索消息,更高效地处理大型电子邮件存档——提升性能并降低内存负担。使用以下方法的 MboxStorageReader 类:

下面的代码示例演示了如何通过定义起始索引和批量大小,从邮件存档中读取特定范围的消息。在示例中,该方法检索从索引 0 开始的 10 条消息。

using Aspose.Email.Storage.Mbox;
using Aspose.Email;

var reader = MboxStorageReader.CreateReader("input.mbox", new MboxLoadOptions());
int startIndex = 0;
int count = 10; // Retrieve messages in batches of 10

foreach (var message in reader.EnumerateMessages(startIndex, count))
{
    Console.WriteLine("Subject: " + message.Subject);
}

在加载 MBOX 文件进行读取时设置首选文本编码

编码选项可用于 MboxrdStorageReader class. 这提供了加载 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();
    }
}