介绍

Aspose.Email FOSS for Python 是一个免费、采用 MIT 许可证的库,用于在纯 Python 中创建、读取和转换兼容 Outlook 的消息文件。它在 PyPI 上以 aspose-email-foss 的形式提供,可在 Windows、macOS、Linux、Docker 以及无服务器环境中运行,无需 Microsoft Office 依赖,也不需要专有运行时。

该库涵盖两个主要领域:用于处理消息主题、正文、收件人和附件的高级 MAPI 层 (MapiMessage);以及低级结构层 (MsgReader, CFBReader, CFBStorage, CFBStream),它公开了支撑每个 .msg 文件的原始复合文件二进制容器。

本文将逐步介绍在 26.3 版本中发布的关键特性,以已确认的 API 表面为基础。


关键特性

使用 MapiMessage 的高级消息创建

MapiMessage 是从头创建兼容 Outlook 的消息的主要入口点。使用主题和正文调用 MapiMessage.create(),添加收件人和附件,然后直接保存为 .msg 文件。

from aspose.email_foss import msg

message = msg.MapiMessage.create(
    "Quarterly status update",
    "Hello team,\n\nPlease review the attached summary.\n\nRegards,\nEngineering",
)

message.set_property(msg.PropertyId.SENDER_NAME, "Build Agent")
message.set_property(msg.PropertyId.SENDER_EMAIL_ADDRESS, "agent@example.com")

message.add_recipient("alice@example.com", display_name="Alice Example")
message.add_recipient(
    "carol@example.com",
    display_name="Carol Example",
    recipient_type=msg.RECIPIENT_TYPE_CC,
)

message.add_attachment("report.txt", b"Summary content here.\n", mime_type="text/plain")
message.save("output.msg")

读取和检查 MSG 文件

MsgReader 提供对现有 .msg 文件的结构化访问,而无需将其完全加载到 MapiMessage 中。它单独公开顶层属性条目、收件人存储和附件存储,使其在大文件检查和验证流水线中实用。

from aspose.email_foss import msg

with msg.MsgReader.from_file("output.msg") as reader:
    header = reader.top_level_header
    print(f"Recipients : {header.recipient_count}")
    print(f"Attachments: {header.attachment_count}")

    for entry in reader.iter_recipient_storages():
        _, props = reader.parse_subobject_property_stream(entry.stream_id)
        print(f"  Recipient storage {entry.name}: {len(props)} property entries")

MSG 循环往返:加载、修改、保存

由于 MapiMessage 支持 from_file() 用于加载,且支持 save() 用于写入,完整的读-改-写循环只需几行代码。通过 set_propertyPropertyIdMapiNamedProperty 可使用命名属性、类型化枚举和 Unicode 字符串处理。

from aspose.email_foss import msg

with msg.MapiMessage.from_file("original.msg") as message:
    message.set_property(msg.PropertyId.SUBJECT, "Updated Subject")
    message.save("updated.msg")

EML / RFC 5322 转换

MapiMessage.to_email_message() 将已加载的 MSG 转换为标准的 Python email.message.EmailMessage 对象,使用标准库即可导出为 RFC 5322 .eml 格式。相反方向(MapiMessage.from_email_message())则从 EmailMessage 构建一个 MapiMessage

from pathlib import Path
from aspose.email_foss import msg

with msg.MapiMessage.from_file("message.msg") as message:
    eml_bytes = message.to_email_bytes()
    Path("message.eml").write_bytes(eml_bytes)

# Reverse: load EML into MapiMessage
import email
raw_eml = Path("message.eml").read_bytes()
email_obj = email.message_from_bytes(raw_eml)
mapi = msg.MapiMessage.from_email_message(email_obj)
mapi.save("from_eml.msg")

CFB 容器遍历

每个 .msg 文件都是一个复合文件二进制(CFB)容器。CFBReader 提供对目录树的只读访问,允许您列出存储和流、遍历层次结构,并提取原始流字节——无需依赖 MsgReader

from aspose.email_foss.cfb import CFBReader

with CFBReader.from_file("message.msg") as reader:
    print(f"CFB version  : {reader.major_version}")
    print(f"Sector size  : {reader.sector_size}")

    for depth, entry in reader.iter_tree():
        indent = "  " * depth
        size = entry.stream_size if entry.is_stream() else "-"
        print(f"{indent}{entry.name}  [size={size}]")

附件处理

附件可通过 MapiMessage.add_attachment()(用于二进制数据)或 MapiMessage.add_embedded_message_attachment()(用于嵌套的 MSG 消息)添加。两种方法均接受文件名、原始字节以及可选的 MIME 类型。

from aspose.email_foss import msg

message = msg.MapiMessage.create("Attachment demo", "See files below.")
message.add_attachment("data.csv", b"id,value\n1,100\n", mime_type="text/csv")

inner = msg.MapiMessage.create("Nested message", "This is embedded.")
message.add_embedded_message_attachment(inner, "nested.msg")
message.save("with_attachments.msg")

快速入门

pip install aspose-email-foss
from aspose.email_foss import msg

# Create and save a minimal MSG
message = msg.MapiMessage.create("Hello World", "This is a test message.")
message.set_property(msg.PropertyId.SENDER_EMAIL_ADDRESS, "sender@example.com")
message.add_recipient("recipient@example.com", display_name="Recipient")
message.save("hello.msg")

# Load it back and convert to EML
with msg.MapiMessage.from_file("hello.msg") as loaded:
    print(loaded.get_property_value(msg.PropertyId.SUBJECT))
    eml = loaded.to_email_bytes()
    open("hello.eml", "wb").write(eml)

支持的格式

格式扩展名读取写入
复合文件二进制.cfb
Outlook 消息.msg
EML / RFC 5322.eml

开源与许可

Aspose.Email FOSS for Python 在 MIT 许可证下发布。源码仓库可在 github.com/aspose-email-foss 获取,软件包已在 PyPI 上以 aspose-email-foss 的形式发布。根据 MIT 条款,允许商业使用、修改和再分发。


开始使用

相关资源