在C#开发中,如果需要处理Outlook生成的.pst邮件存档文件,由于pst是微软专属的二进制存储格式,没有公开的官方完整规范,直接手动解析二进制结构的工作量极大,通常可以借助成熟的第三方库来快速实现读取功能。

常用第三方库选择
目前C#生态中处理pst文件的主流库是MsgKit和OutlookPstReader,其中OutlookPstReader对pst文件的兼容性更好,支持读取不同版本的Outlook生成的pst文件,不需要依赖本地安装Outlook客户端,适合服务端场景使用。
基础读取实现步骤
1. 安装依赖库
首先通过NuGet安装OutlookPstReader库,在包管理器控制台执行以下命令:
Install-Package OutlookPstReader
2. 加载pst文件并遍历根目录
加载pst文件后,首先可以获取根目录下的所有文件夹,pst文件的结构是树形层级,和Outlook中的文件夹结构一致:
using OutlookPstReader;
using System;
using System.Collections.Generic;
class PstReaderDemo
{
static void Main()
{
// pst文件路径,替换为实际路径
string pstFilePath = @"D:testarchive.pst";
// 加载pst文件
using (var pstFile = new PstFile(pstFilePath))
{
// 获取根文件夹
var rootFolder = pstFile.RootFolder;
Console.WriteLine($"根文件夹名称:{rootFolder.Name}");
// 遍历根目录下的子文件夹
TraverseFolders(rootFolder);
}
}
// 递归遍历所有文件夹
static void TraverseFolders(PstFolder folder)
{
foreach (var subFolder in folder.SubFolders)
{
Console.WriteLine($"文件夹:{subFolder.Name},包含邮件数:{subFolder.Contents.Count}");
// 递归处理子文件夹
TraverseFolders(subFolder);
}
}
}
3. 提取邮件详细信息
遍历到目标文件夹后,可以提取文件夹内所有邮件的核心属性,包括主题、发件人、收件人、发送时间、邮件正文等:
static void ReadMailsInFolder(PstFolder folder)
{
// 遍历文件夹内的所有内容,筛选邮件类型
foreach (var item in folder.Contents)
{
if (item is PstMail mail)
{
Console.WriteLine("----- 邮件信息 -----");
Console.WriteLine($"主题:{mail.Subject}");
Console.WriteLine($"发件人:{mail.SenderName} <{mail.SenderEmailAddress}>");
Console.WriteLine($"发送时间:{mail.SentTime}");
Console.WriteLine($"收件人:{mail.ReceivedByName}");
// 获取邮件纯文本正文,如果是HTML格式可以通过mail.HtmlBody获取
Console.WriteLine($"正文摘要:{mail.Body?.Substring(0, Math.Min(50, mail.Body?.Length ?? 0))}");
}
}
}
注意事项
- pst文件分为ANSI格式和Unicode格式,老版本Outlook生成的ANSI格式pst可能存在编码问题,读取时如果遇到乱码可以尝试指定编码为GB2312。
- 如果pst文件被加密或者设置了密码,第三方库可能无法直接读取,需要先移除密码再处理。
- 读取大体积的pst文件时,建议分批次处理,避免一次性加载全部内容导致内存占用过高。
- 部分pst文件可能包含损坏的邮件数据,读取时需要添加异常处理,避免程序崩溃。
常见扩展需求
如果需要将读取到的邮件数据保存到数据库或者导出为EML格式,可以在提取到邮件属性后做进一步处理,比如导出EML格式可以参考以下逻辑:
static void ExportMailToEml(PstMail mail, string exportDir)
{
// 构造EML文件路径
string emlPath = System.IO.Path.Combine(exportDir, $"{Guid.NewGuid()}.eml");
// 构建EML内容,符合RFC822规范
var emlContent = new System.Text.StringBuilder();
emlContent.AppendLine($"From: {mail.SenderName} <{mail.SenderEmailAddress}>");
emlContent.AppendLine($"To: {mail.ReceivedByName} <{mail.ReceivedByEmailAddress}>");
emlContent.AppendLine($"Subject: {mail.Subject}");
emlContent.AppendLine($"Date: {mail.SentTime:R}");
emlContent.AppendLine("Content-Type: text/plain; charset=utf-8");
emlContent.AppendLine();
emlContent.AppendLine(mail.Body);
// 写入文件
System.IO.File.WriteAllText(emlPath, emlContent.ToString(), System.Text.Encoding.UTF8);
Console.WriteLine($"邮件已导出到:{emlPath}");
}
C#PST文件解析Outlook_pst读取邮件存档处理修改时间:2026-07-06 21:36:28