Mbox 存储文件

在本文中,我们将探讨 mbox 格式,并为您提供代码片段以帮助您开始阅读 mbox 文件。您将学习如何解析 mbox 文件以及查看和保存其中包含的消息。

什么是 Mbox 格式?

mbox 格式是一种广泛使用的用于存储电子邮件的文件格式。它有着悠久的历史,并受到多种流行电子邮件客户端的支持,包括 Thunderbird、Apple Mail 等。在 mbox 格式中,多封电子邮件以纯文本形式存储在单个文件中,方便归档和传输电子邮件数据。

mbox 格式有不同的变体,每种变体都有自己的实现细节。一些常见的 mbox 格式包括“mboxrd”、“mboxo”、“mboxcl”、“mboxcl2”。这些变体主要在处理某些方面(例如消息分隔符和元数据)的方式上有所不同。使用 mbox 文件时了解这些差异非常重要,因为它们会影响电子邮件数据的兼容性和解析。

让我们仔细看看一些电子邮件客户端以及它们如何利用 mbox 格式:

  • Thunderbird:Thunderbird 是一种流行的开源电子邮件客户端,它使用 mbox 格式存储电子邮件。它将文件夹中的所有邮件存储在扩展名为“.mbox”的单个 mbox 文件中。 Thunderbird 为用户邮箱中的每个文件夹创建单独的 mbox 文件,从而轻松管理和备份电子邮件数据。

  • Apple Mail:Apple Mail 是 macOS 和 iOS 设备上的默认电子邮件客户端,也采用 mbox 格式。它将每个邮箱文件夹存储为单独的 mbox 文件,使在 Apple Mail 安装之间迁移或传输电子邮件数据变得简单。 Apple Mail mbox 文件通常具有扩展名“.mbox”或“.mbox.plist”。

  • Eudora:Eudora 是过去流行的电子邮件客户端,使用 mbox 格式存储电子邮件。它使用了一种稍微修改过的 mbox 格式,称为“Eudora 邮箱格式”。 Eudora 邮箱格式包含了 Eudora 特有的附加功能和元数据,例如标签和状态标志。

这些只是使用 mbox 格式的电子邮件客户端的几个示例。以编程方式处理 mbox 文件时,了解 mbox 格式及其在不同电子邮件客户端中的用法至关重要,因为它有助于确保电子邮件数据的兼容性和准确解析。

用于读取 Mbox 文件的 .NET API

要在 C# 中使用 mbox 文件,我们将使用 Aspose.Email for .NET。这个强大且功能丰富的库提供了广泛的电子邮件处理功能,包括读取 mbox 文件、提取消息和操作电子邮件数据。 值得注意的是,Aspose.Email for .NET 提供了对各种 mbox 格式的全面支持,包括上面提到的格式。这使您可以无缝地使用来自不同电子邮件客户端的 mbox 文件,而不管具体的 mbox 实施细节如何。要利用 API 的强大功能,可以使用以下命令下载其 DLL 或从 NuGet 安装它:

PM> Install-Package Aspose.Email

打开 Mbox 文件

现在我们对 mbox 格式及其在不同电子邮件客户端中的用法有了更好的了解,让我们继续探索使用 Aspose.Email 处理 mbox 文件的功能和实践。 要开始解析 mbox 文件,我们需要打开它。以下是打开 .mbox 文件的步骤:

  • 首先,我们创建 MboxLoadOptions 的实例来指定加载 mbox 文件所需的选项。

  • 然后,我们将 LeaveOpen 设置为 false,以便在读取后自动关闭 mbox 文件,并指定 Encoding.UTF8 作为首选文本编码。

  • 最后,我们通过调用 CreateReader 静态方法创建 MboxStorageReader 类的实例,并传入源 MBOX 文件名和 MboxLoadOptions 实例。

这些步骤如以下代码片段所示:

var mboxLoadOptions = new MboxLoadOptions
{
    LeaveOpen = false,
    PreferredTextEncoding = Encoding.UTF8
};

var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions);

列出消息

打开 mbox 文件后,我们可以检索有关存储的消息的信息。以下代码片段演示了从 mbox 文件列出消息的两种方法。

方法一:使用EnumerateMessageInfo方法

MboxStorageReader 类的 EnumerateMessageInfo 方法用于迭代消息并查看基本消息信息,例如主题、字段从、到和日期。它还返回一个消息标识符(条目 ID),稍后可以使用该标识符来读取完整的消息内容。该方法具有以下特点:

  • 性能:与第二种方法相比,这种方法的性能更高,因为它只读取和查看基本消息信息。它避免了迭代期间解析和加载整个消息内容的开销。

  • 效率:通过仅获取必要的信息,可以最大限度地减少内存消耗和处理时间。这在处理包含大量消息的大型 mbox 文件时特别有用。

但是,需要注意的是,使用这种方法时,在初始迭代期间不会加载完整的消息内容。相反,仅获取必要的详细信息,这样可以加快初始处理速度。

以下代码片段演示了使用 EnumerateMessageInfo 方法迭代消息及其信息检索的过程。

using (var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions))
{
    foreach (var messageInfo in mbox.EnumerateMessageInfo())
    {
        Console.WriteLine(messageInfo.Subject);
        Console.WriteLine(messageInfo.From);
        Console.WriteLine(messageInfo.To);
        Console.WriteLine(messageInfo.Date);
    }
}

这样,我们就可以访问主题、发件人、收件人和日期等属性来显示相关详细信息。

方法 2:使用 EnumerateMessages 方法

第二种方法涉及使用 EnumerateMessages 方法直接迭代 mbox 文件中包含的 MailMessage 实例。这种方法在每次迭代期间读取并加载整个消息内容,从而能够立即访问完整的电子邮件信息。以下是该方法的一些关键方面:

  • 完整性:与第一种方法不同,此方法允许您访问和处理整个邮件内容,包括正文、附件、标头和其他部分。它提供了在迭代期间对完整电子邮件数据的全面访问。

  • 方便:当您想要对完整消息执行操作时,例如将每条消息保存到单独的文件中(如示例所示),此方法非常有用。它通过在每次迭代中加载整个消息内容来简化流程,使您无需进行后续查找即可执行所需的操作。

但是,重要的是要考虑到在每次迭代期间加载整个消息内容可能会对性能产生影响,尤其是在处理大型 mbox 文件或大量消息时。在两种方法之间进行选择时,加载完整消息内容所需的额外处理时间可能是需要考虑的权衡。

以下代码片段演示了使用 EnumerateMessages 方法迭代消息并检索整个消息内容的过程。

using (var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions))
{
    foreach (var eml in mbox.EnumerateMessages())
    {
        eml.Save($@"{eml.Subject}.eml");
    }
}

这样,我们可以对每条消息执行各种操作,例如将它们保存到单独的 .eml 文件中,如示例所示。

最终,这些方法之间的选择取决于您的具体用例和要求。如果您需要快速访问基本消息信息并对特定消息进行进一步操作,第一种方法性能更好。另一方面,如果您需要立即访问完整的消息内容并希望一次对所有消息执行操作,则第二种方法提供了便利,但性能稍低。

在决定哪种方法更适合您的场景时,评估您的具体需求并考虑 mbox 文件大小、消息数量以及您打算执行的操作等因素非常重要。

阅读消息

在上一节中,我们讨论了如何列出消息。现在,让我们探讨如何使用字符串标识符读取各个消息,该字符串标识符可以从枚举 MessageInfo 的第一种方法派生。

使用 EnumerateMessageInfo 方法列出消息时,每条消息都与单个 mbox 文件中的唯一标识符关联。此标识符通常表示为字符串,可以从 MboxMessageInfo 对象的 EntryId 属性获取。

一旦我们获得了消息标识符,我们就可以通过以下步骤使用它来查看完整的消息内容:

  • 我们创建 EmlLoadOptions 的实例来指定加载提取的消息所需的选项。
  • 我们允许保留嵌入式消息格式和 TNEF 附件。
  • 在 foreach 循环内,我们访问每个 MboxMessageInfo 对象的 EntryId 属性,该属性表示相应消息的唯一标识符。
  • 然后,我们使用此标识符以及 MboxStorageReader 类的 ExtractMessage 方法来检索完整的消息作为 MailMessage 对象。
  • 最后,我们可以对消息执行任何所需的操作,例如将其保存到单独的 .eml 文件中。

下面的代码片段演示了如何使用字符串标识符读取单个消息:

var emlLoadOptions = new EmlLoadOptions
{
    PreserveEmbeddedMessageFormat = true,
    PreserveTnefAttachments = true
};

using (var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions))
{
    foreach (var messageInfo in mbox.EnumerateMessageInfo())
    {
        var eml = mbox.ExtractMessage(messageInfo.EntryId, emlLoadOptions);
        eml.Save($@"{eml.Subject}.eml");
    }
}

通过利用从枚举 MessageInfo 的第一种方法获得的消息标识符,我们可以根据我们的特定要求高效地读取各个消息。

值得注意的是,这种方法允许您有选择地阅读和处理感兴趣的消息,同时跳过其他消息。在处理包含大量消息的大型 mbox 文件时,这种灵活性特别有价值,因为它可以最大限度地减少不必要的处理并提高整体效率。

请记住,消息标识符在单个 mbox 文件中是唯一的。如果您需要跨多个 mbox 文件处理消息,则需要维护标识符及其相应文件之间的映射。

由于能够使用唯一的字符串标识符读取单个消息,您在处理 mbox 文件时拥有更大的控制力和灵活性,并且可以有效地提取和操作所需的电子邮件内容。

实用功能

Aspose.Email 库提供了多种实用功能,在处理 mbox 文件时非常方便。这里有几个例子:

获取 mbox 中存储的总项目数

我们可以使用 GetTotalItemsCount 方法轻松查看 mbox 文件中存储的项目总数。这对于跟踪电子邮件集合的大小非常有用。使用以下代码片段来实现此目的。

using (var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions))
{
    var itemsCount = mbox.GetTotalItemsCount();
}

获取一次迭代读取的数据大小

通过在迭代期间访问 CurrentDataSize 属性,我们可以获得一次迭代中读取的数据的大小。这对于性能优化或进度跟踪来说可能是有价值的信息。要实现此目的,请使用以下代码片段:

using (var mbox = MboxStorageReader.CreateReader(fileName, mboxLoadOptions))
{
    foreach (var messageInfo in mbox.EnumerateMessageInfo())
    {
        var messageSize = mbox.CurrentDataSize;
    }
}

结论

在本文中,我们探讨了 mbox 格式并介绍了 Aspose.Email for .NET 库作为在 C# 项目中处理 mbox 文件的强大工具。我们介绍了如何打开 mbox 文件、解析和查看消息,并展示了一些实用功能。有了这些知识和提供的代码片段,您现在就可以在编程工作中轻松处理 mbox 文件了。 您可以使用文档探索Aspose.Email的其他功能。此外,您还可以将您的疑问发布到我们的论坛

也可以看看