在 C# .NET 中读取 MS Outlook PST 文件

PST(个人存储表) 是一种存储文件格式,供不同的 Microsoft 程序使用,例如 MS Outlook、Exchange 和 Windows Messaging。 PST 文件能够存储消息、联系人、日历、事件等。在某些情况下,您可能需要解析 PST 文件并以编程方式从中提取数据。为此,本文展示了如何使用 C# .NET 读取 MS Outlook PST 文件。特别是,您将学习如何从 PST 文件中提取文件夹信息、阅读电子邮件和获取联系人。

.NET API 读取 Outlook PST 文件

Aspose.Email for .NET 是一个强大的电子邮件处理 API,可让您在 .NET 应用程序中创建和发送电子邮件。此外,它还支持使用流行的电子邮件和存储文件格式。我们将使用此 API 从 PST 文件中读取文件夹的信息、消息和联系人。您可以 下载 API 或通过 NuGet 安装它。

PM> Install-Package Aspose.Email -Version 22.3.0

在 C# .NET 中读取 Outlook PST 文件

以下是读取 PST 文件并在 C# 中提取其信息的步骤。

以下代码示例显示了如何解析 PST 文件并获取文件夹的信息。

// 加载 PST 文件
PersonalStorage personalStorage = PersonalStorage.FromFile("PersonalStorage.pst");

// 获取文件夹信息
FolderInfoCollection folderInfoCollection = personalStorage.RootFolder.GetSubFolders();

// 浏览每个文件夹以显示其信息
foreach (FolderInfo folderInfo in folderInfoCollection)
{
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("Total items: " + folderInfo.ContentCount);
    Console.WriteLine("Total unread items: " + folderInfo.ContentUnreadCount);
    Console.WriteLine("-----------------------------------");
}

在 C# 中从 PST 文件中读取电子邮件

电子邮件是 MS Outlook 存储在 PST 文件中的主要实体。那么让我们看看如何在 C# 中从 PST 文件中读取电子邮件消息。

以下代码示例展示了如何从 C# .NET 中的 PST 文件中提取消息。

// 加载 Outlook PST 文件
PersonalStorage pst = PersonalStorage.FromFile("PersonalStorage.pst");

// 获取 PST 文件的显示格式
Console.WriteLine("Display Format: " + pst.Format);

// 获取文件夹和消息信息
Aspose.Email.Storage.Pst.FolderInfo folderInfo = pst.RootFolder;

// 调用递归方法从每个文件夹中提取msg文件
ExtractMsgFiles(folderInfo, pst);

///<summary>
/// 这是一种递归方式来显示文件夹的内容
///</summary>
///<param name="folderInfo"></param>
///<param name="pst"></param>
private static void ExtractMsgFiles(Aspose.Email.Storage.Pst.FolderInfo folderInfo, PersonalStorage pst)
{
    // 显示文件夹名称
    Console.WriteLine("Folder: " + folderInfo.DisplayName);
    Console.WriteLine("==================================");
            
    // 循环浏览此文件夹中的所有邮件
    Aspose.Email.Storage.Pst.MessageInfoCollection messageInfoCollection = folderInfo.GetContents();
    foreach (Aspose.Email.Storage.Pst.MessageInfo messageInfo in messageInfoCollection)
    {
        Console.WriteLine("Saving message {0} ....", messageInfo.Subject);
                
        // 获取 MapiMessage 实例中的消息
        MapiMessage message = pst.ExtractMessage(messageInfo);
                
        // 将此消息以 msg 格式保存到磁盘
        message.Save(message.Subject.Replace(":", " ") + ".msg");
                
        // 将此消息保存到 msg 格式的流中
        MemoryStream messageStream = new MemoryStream();
        message.Save(messageStream);
    }

    // 为每个子文件夹递归调用此方法
    if (folderInfo.HasSubFolders == true)
    {
        foreach (Aspose.Email.Storage.Pst.FolderInfo subfolderInfo in folderInfo.GetSubFolders())
        {
            ExtractMsgFiles(subfolderInfo, pst);
        }
    }
}

从 C# 中的 PST 文件中提取联系人

在某些情况下,您可能需要提取存储在 PST 文件中的联系人信息。以下步骤演示了如何在 C# 中访问 PST 文件中的联系人。

以下代码示例展示了如何在 C# 中从 PST 文件中提取联系人。

// 加载 Outlook PST 文件
PersonalStorage personalStorage = PersonalStorage.FromFile("SampleContacts.pst");

// 获取联系人文件夹
FolderInfo folderInfo = personalStorage.RootFolder.GetSubFolder("Contacts");

// 循环浏览此文件夹中的所有联系人
MessageInfoCollection messageInfoCollection = folderInfo.GetContents();

foreach (MessageInfo messageInfo in messageInfoCollection)
{
    // 获取联系信息
    MapiMessage mapi = personalStorage.ExtractMessage(messageInfo);
    
    // 投射到 MapiContact
    MapiContact contact = (MapiContact)mapi.ToMapiMessageItem();

    // 在屏幕上显示一些内容
    Console.WriteLine("Name: " + contact.NameInfo.DisplayName);
    
    // 以 MSG 格式保存到磁盘
    if (contact.NameInfo.DisplayName != null)
    {
        MapiMessage message = personalStorage.ExtractMessage(messageInfo);
        
        // 去掉不能用作文件名的非法字符
        string messageName = message.Subject.Replace(":", " ").Replace("\\", " ").Replace("?", " ").Replace("/", " ");
        message.Save(dataDir + "Contacts\\" + messageName + "_out.msg");
    }
}

获取免费 API 许可证

您可以通过 获得临时许可证 免费试用 Aspose.Email for .NET。

结论

在本文中,您学习了如何在 C# .NET 中以编程方式读取 PST 文件。此外,您还了解了如何在 C# 中读取文件夹信息、获取电子邮件以及从 PST 文件中提取联系人。此外,您可以使用 documentation 探索更多关于 Aspose.Email for .NET 的信息。此外,您可以在我们的 论坛 上分享您的问题或疑问。

也可以看看