1. 产品
  2.   Aspose.Email
  3.   Aspose.Email FOSS for .NET

针对 .NET 的 Aspose.Email FOSS

从 .NET 读取、创建和处理 Outlook MSG 文件、CFB 容器和 EML 消息——免费开源,无需 Microsoft Outlook 依赖。

开源 .NET 库,用于 MSG、CFB 和 EML 文件

Aspose.Email FOSS for .NET 是一个 MIT 许可证、无依赖的 C# 库,用于处理 Microsoft Outlook .msg 文件、复合文件二进制(CFB)容器和 EML 消息。添加单个 NuGet 包,即可立即开始读取、创建和处理电子邮件,而无需安装 Microsoft Outlook 或任何专有运行时。

该库提供两个访问层级。低层级中,CfbReaderCfbWriter 提供对 CFB 二进制容器的完整控制——遍历目录条目,读取和写入存储节点及流数据,并检查原始扇区布局。MsgReaderMsgWriter 在 CFB 之上处理 MSG 格式,公开 MAPI 属性流、收件人表和附件子存储。高层级中,MapiMessage 允许您从头创建新消息,读取主题、正文、发件人和收件人,管理附件,并通过内置的 MIME 实现实现 MSG 与 EML 格式之间的转换。

该库面向 .NET 8.0 或更高版本,并且没有本机依赖,使其适用于 Windows、Linux、macOS、Docker 容器和无服务器函数。有关其他功能和商业支持,请参阅 Aspose.Email for .NET

CFB 容器读取与写入

  • 打开 CFB 文件: 通过 CfbReader.FromFile()CfbReader.FromStream()new CfbReader(data) 从文件路径、流或字节数组加载现有 CFB 容器。
  • 遍历目录树: 使用 IterStorages()IterStreams()IterChildren()IterTree() 迭代存储、流和子项。
  • 解析路径: 使用 ResolvePath(names) 在嵌套的存储层次结构中导航,以通过名称链定位特定流。
  • 写入 CFB 容器: 使用 CfbDocument 以编程方式构建 CFB 文档,并通过 CfbWriter.ToBytes()CfbWriter.WriteFile() 将其序列化为字节或文件。
  • 添加存储和流: 在序列化之前,将 CfbStorageCfbStream 节点附加到任意存储节点上。

CFB Access 的使用位置

  • MSG 文件检查: CFB 是 Outlook .msg 文件的容器格式 — 直接访问 CFB 可实现取证检查和修复。
  • 自定义二进制格式: 任何使用 CFB 进行数据存储的旧版应用程序都可以在没有 COM 依赖的情况下读取或写入。
  • 数据恢复: 遍历完整的目录树,并从损坏或非标准的 CFB 文件中提取原始流字节。
  • 二进制往返测试: 将文档序列化为字节并重新加载,以在自动化测试中验证无损序列化。

MSG 文件读取与写入

  • 读取 MSG 文件: 使用 MsgReader.FromFile()MsgReader.FromStream() 打开 Outlook MSG 文件,并访问底层的 MAPI 属性流、收件人记录和附件子存储。
  • 编写 MSG 文件: 使用 MsgWriter.ToBytes()MsgWriter.WriteFile()MsgDocument 生成 MSG 文件。
  • Low-level MAPI access: 读取顶层属性流、命名属性和附件数据,通过 MsgStorageMsgStreamMsgStorage.FindStream()
  • MSG 存储导航: 使用 MsgStorage.FindStream()MsgStorage.FindStorage() 来定位命名的子条目。

MSG 处理的使用场景

  • Email archival pipelines: 批量读取存档目录中的 .msg 文件并提取元数据或附件。
  • 迁移工具: 将 MSG 集合转换为标准格式,以导入非 Outlook 系统。
  • 法律取证: 解析原始 MAPI 属性流,以提取所有消息字段,包括非标准属性。
  • Automated report delivery: 以编程方式构建 .msg 文件并将其发送到基于 Outlook 的邮件系统。

高级消息 API

  • 创建消息: 使用 MapiMessage.Create(subject, body) 构建完整的电子邮件,设置 SenderNameSenderEmailAddressHtmlBody
  • 添加收件人: 附加 ToCcBcc 收件人,通过 AddRecipient(),包括电子邮件地址和显示名称。
  • 管理附件: 使用 AddAttachment() 添加文件和流附件,或直接使用 FilenameMimeTypeContentIdData 构造 MapiAttachment 对象。
  • 保存并重新加载: 使用 message.Save()message.Save(stream) 序列化,并使用 MapiMessage.FromFile()MapiMessage.FromStream() 重新加载。

高级 API 的使用场景

  • 自动化电子邮件生成: 从批处理作业中的数据记录生成数千个个性化的 MSG 文件。
  • Test fixture creation: 构建已知良好的 MSG 文件,内容可预测,以用于集成测试套件。
  • 附件提取: 加载 MSG 文件,遍历 message.Attachments,并将每个 attachment.Data 保存到磁盘。
  • 属性检查: 在不使用 COM 自动化的情况下访问 message.Subjectmessage.Bodymessage.SenderEmailAddressmessage.Recipients

EML 和 MIME 转换

  • Load EML into MapiMessage: 将标准 .eml 文件(RFC 5322 / MIME)解析为完整的 MapiMessage 对象,通过 MapiMessage.LoadFromEml(stream)
  • Save MapiMessage as EML:MapiMessage 序列化回 MIME 格式,使用 message.SaveToEml()message.SaveToEml(stream)
  • 往返完整性: 主题、正文、HTML 正文、发件人、收件人和附件在 EML → MSG → EML 往返过程中全部保留。
  • 无外部 MIME 解析器: EML 解析在库内部原生实现 — 无需 System.Net.Mail 依赖。

EML 转换的使用场景

  • 格式桥接: 从邮件服务器接收 EML 邮件并转换为 MSG,以实现 Outlook 兼容的存储。
  • 标准合规性: 将专有 MSG 文件转换为标准 MIME,以便交付到任何邮件传输。
  • 归档标准化: 将包含 .eml.msg 文件的混合归档规范化为单一格式。
  • Testing workflows: 在测试中生成 .eml 固件,并验证它们在 MSG 循环往返中没有数据丢失。

从 MSG 文件读取主题

从流中打开 Outlook MSG 文件并打印主题 — 无需 Microsoft Outlook。

using System.IO;
using Aspose.Email.Foss.Msg;
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);

创建并保存 MSG 消息

构建包含发件人、收件人和附件的完整电子邮件,然后将其写入 MSG 文件。

using System.IO;
using Aspose.Email.Foss.Msg;
var message = MapiMessage.Create("Hello", "Body");
message.SenderName = "Alice";
message.SenderEmailAddress = "alice@example.com";
message.AddRecipient("bob@example.com", "Bob");
using var attachmentStream = new MemoryStream("abc"u8.ToArray());
message.AddAttachment("note.txt", attachmentStream, "text/plain");
using var output = File.Create("hello.msg");
message.Save(output);

将 EML 转换为 MSG

加载标准 .eml 文件,并使用内置的 MIME 解析器将其保存为 Outlook .msg 文件。

using System.IO;
using Aspose.Email.Foss.Msg;
using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);
using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);
  

支持和学习资源

 中文