Last Updated: 15 Oct, 2025

在使用电子邮件文件格式时,您可能会遇到两种常见格式:MSG 和 EML。这两种格式都存储电子邮件信息,但在结构、兼容性和用法上有所不同。在本篇博文中,我们将探讨它们的含义、功能和区别,以及如何使用各种API和代码示例在MSG 和 EML 之间进行转换。
什么是 MSG 文件?
MSG 文件格式是由 Microsoft 开发的专有格式。它是从 Microsoft Outlook 保存的单封电子邮件、约会、联系人或任务。它是一种专有格式,这意味着它旨在在 Outlook 生态系统 中发挥最佳作用。MSG 文件包含电子邮件的所有详细信息,包括发件人、收件人、日期、主题、正文和附件,以及 Outlook 特有的功能,例如类别和标记。
主要功能:
- 存储电子邮件内容、附件和元数据(发件人、收件人、主题)。
- 基于复合文件二进制格式 (CFBF) 的二进制格式。
- 存储元数据、电子邮件正文(RTF 或 HTML)和附件。
- 主要用于 Windows 环境。
什么是 EML 文件?
EML 文件格式是 RFC 5322 中定义的开放标准,是一种更通用的电子邮件格式,被各种电子邮件客户端(例如 Mozilla Thunderbird、Windows Mail、Outlook Express 和 Apple Mail)使用。由于它是一种纯文本格式,因此用途更广泛,可以在不同的操作系统和设备上打开。
主要功能:
- 基于文本的格式,用于存储标头和 MIME 编码的内容。
- 完全支持 HTML 格式、内联图像和附件。
- 独立于平台且易于阅读。
- 更易于以编程方式处理。
MSG 和 EML 之间的主要区别
编号 | 功能 | MSG 格式 | EML 格式 |
---|---|---|---|
1 | 格式类型 | 二进制(专有) | 纯文本(标准) |
2 | 兼容性 | Microsoft Outlook | Thunderbird、Apple Mail、Gmail 等 |
3 | 元数据支持 | 完全(包括嵌入对象) | 有限(基本标头和 MIME) |
4 | 可读性要求 | Outlook 或专用工具 | 人类可读(基于文本) |
5 | 附件处理 | 嵌入文件 | MIME 中的 Base64 编码 |
现在,让我们探索如何使用流行的开源 API和库将MSG 转换为 EML以及将EML 转换为 MSG。以下是使用不同 API 的代码示例。
如何使用 .NET API 将 MSG 文件转换为 EML 文件?
我们可以使用开源库 MsgKit 和 MimeKit 在 .NET 应用程序中将 MSG 文件转换为 EML 文件格式。虽然 MsgKit 本身不提供原生的 .eml 导出功能,但它可以轻松读取和提取 .msg 文件的所有组件,然后可以使用其他兼容 MIME 的库(例如 MimeKit 或 MailKit)将其导出为 .eml 文件,如以下代码示例所示。
如何使用 MsgKit 将 MSG 文件转换为 EML 文件?
using MsgReader.Outlook;
using MimeKit;
using System.IO;
var msg = new Storage.Message("sample.msg");
var mimeMessage = new MimeMessage();
mimeMessage.Subject = msg.Subject;
mimeMessage.From.Add(new MailboxAddress(msg.SenderName, msg.SenderEmail));
mimeMessage.To.Add(MailboxAddress.Parse(msg.GetEmailRecipients(Storage.RecipientType.To)[0].Email));
mimeMessage.Body = new TextPart("plain") { Text = msg.BodyText };
using var stream = File.Create("output.eml");
mimeMessage.WriteTo(stream);
如何使用 MimeKit 将 EML 转换为 MSG 文件?
using MsgKit;
using System.IO;
var email = new Email(
new Sender("sender@example.com", "Sender Name"),
"Subject of Email",
"This is the plain body text.");
email.Recipients.AddTo("recipient@example.com", "Recipient Name");
email.Save(new FileInfo("output.msg"));
通过开源 Java API 将 MSG 转换为 EML?
Apache POI-HSMF 和 JavaMail 可用于加载 Outlook MSG 并将其转换为 EML 文件格式。Apache POI-HSMF 可以读取 MSG 文件,而 JavaMail 可以生成 EML 文件。使用 Java 将 EML 转换为 MSG 通常需要付费 SDK(例如 Aspose)或手动进行 MIME 解析和 MSG 二进制写入——目前使用纯开源 Java 库无法实现。
以下代码示例演示了 Apache POI-HSMF 如何读取 MSG 文件,以及 JavaMail 如何生成 EML 文件。
import org.apache.poi.hsmf.MAPIMessage;
import javax.mail.*;
import javax.mail.internet.*;
public class MsgToEmlConverter {
public static void convert(String msgPath, String emlPath) throws Exception {
MAPIMessage msg = new MAPIMessage(msgPath);
MimeMessage eml = new MimeMessage((Session) null);
eml.setFrom(new InternetAddress(msg.getDisplayFrom()));
eml.setSubject(msg.getSubject());
eml.setText(msg.getTextBody());
// Save EML file
eml.writeTo(new java.io.FileOutputStream(emlPath));
}
public static void main(String[] args) throws Exception {
convert("input.msg", "output.eml");
}
}
高性能转换的最佳商业 API
1. Aspose.Email(跨平台 .NET/Java/Python)
Aspose.Email 提供了一个强大的商业解决方案来处理电子邮件文件。只需几行代码,软件开发人员就可以使用各种编程语言(例如 .NET、Java、Python 等)加载、操作和转换 MSG 到 EML 以及 EML 到 MSG。以下示例展示了如何使用 Aspose.Email for .NET API 在 MSG 和 EML 之间进行转换。
如何使用 Aspose.Email for .NET API 将 EML 转换为 MSG?
// Convert MSG to EML
using Aspose.Email.Mime;
using Aspose.Email.Outlook;
var msg = MapiMessage.FromFile("input.msg");
msg.Save("output.eml", SaveOptions.DefaultEml);
// Convert EML to MSG
var eml = MailMessage.Load("input.eml");
eml.Save("output.msg", SaveOptions.DefaultMsgUnicode);
如何使用 Aspose.Email for Java API 将 EML 转换为 MSG?
import com.aspose.email.*; // Load the MSG file MailMessage message = MailMessage.load("input.msg"); // Save as EML message.save("output.eml", SaveOptions.getDefaultEml());
如何使用 Aspose.Email for Python API 将 b/t EML 转换为 MSG?
import aspose.email as ae
# Load the EML file
eml = ae.MailMessage.load("input.eml")
# Save as MSG
eml.save("output.msg", ae.SaveOptions.default_msg_unicode)
2. Microsoft Graph API
另一个值得考虑的商业选择 Microsoft Graph API(基于云)
通过 Microsoft Graph API(基于云)将 MSG 转换为 EML
import requests
headers = {"Authorization": "Bearer YOUR_ACCESS_TOKEN"}
response = requests.post(
"https://graph.microsoft.com/v1.0/me/messages/{id}/content?format=eml",
headers=headers
)
with open("output.eml", "wb") as f:
f.write(response.content)
福利:在线转换器(无需代码)
如果您不想编写代码,这里有一个非常可靠且实用的在线工具,可以轻松加载 MSG 文件并将其转换为 EML 格式。
总结
MSG 和 EML 格式各有优势。MSG 非常适合 Microsoft 生态系统,因为它具有完整的元数据和嵌入式附件;而 EML 则因其基于 MIME 的纯文本结构而具有更大的灵活性。无论您是 .NET、Java、Python 还是 JavaScript 开发人员,都有开源和商业工具可以在 MSG 和 EML 格式之间进行转换。请根据您的语言、项目规模和许可需求进行选择。
常见问题解答
问:我可以在不使用 Outlook 的情况下打开 MSG 文件吗?
答:可以,像 MsgReader (C#) 或 extract-msg (Python) 这样的开源库允许在没有 Outlook 的情况下读取 MSG 文件。
问:哪种格式更适合电子邮件存档?
答:EML 格式更佳,因为它采用开放标准且易于阅读。
问:是否有免费的 API 将 MSG 转换为 EML?
答:有,像 MsgReader (.NET) 和 extract-msg (Python) 这样的库完全免费且开源。