Last Updated: 15 Oct, 2025

MSG 和 EML 有什么区别?如何将 MSG 转换为 EML?

在使用电子邮件文件格式时,您可能会遇到两种常见格式:MSGEML。这两种格式都存储电子邮件信息,但在结构、兼容性和用法上有所不同。在本篇博文中,我们将探讨它们的含义、功能和区别,以及如何使用各种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 OutlookThunderbird、Apple Mail、Gmail 等
3元数据支持完全(包括嵌入对象)有限(基本标头和 MIME)
4可读性要求Outlook 或专用工具人类可读(基于文本)
5附件处理嵌入文件MIME 中的 Base64 编码

现在,让我们探索如何使用流行的开源 API和库将MSG 转换为 EML以及将EML 转换为 MSG。以下是使用不同 API 的代码示例。

如何使用 .NET API 将 MSG 文件转换为 EML 文件?

我们可以使用开源库 MsgKitMimeKit 在 .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) 这样的库完全免费且开源。

另请参阅