Введение

Aspose.Email FOSS for Python is now available on PyPI: a free, MIT-licensed library for creating, reading, and converting Outlook .msg файлы полностью в Python, без зависимости от Microsoft Office или каких‑либо нативных расширений. Установите его с помощью pip install aspose-email-foss>=26.3 и сразу начните работать с контейнерами MSG и CFB.

Библиотека ориентирована на Python 3.10 и новее. Она реализует формат Compound File Binary (CFB) и формат сообщений MSG с нуля, предоставляя детерминированный контроль над сериализацией и чтением электронных писем. Поскольку реализация полностью написана на Python, она работает одинаково на Windows, macOS, Linux и в контейнеризованных средах.

Aspose.Email FOSS is designed for developers building email processing pipelines, compliance archival tools, forensic analysis workflows, or any application that needs to create or inspect Outlook-compatible message files without a running Exchange or Outlook installation.


Ключевые возможности

Создание MSG‑файлов

Создавайте совместимые с Outlook .msg файлы с нуля, используя MapiMessage.create(). Устанавливайте стандартные свойства MAPI, такие как тема, отправитель, время доставки и поля отображения, через PropertyId перечисление. Добавляйте получателей с помощью add_recipient() и вложения файлов с помощью add_attachment(), затем сохраните результат на диск.

from aspose.email_foss import msg

message = msg.MapiMessage.create(
    "Quarterly status update and rollout plan",
    "Hello team,\n\nPlease find the latest rollout summary attached.\n\nRegards,\nEngineering",
)

message.set_property(msg.PropertyId.SENDER_NAME, "Build Agent")
message.set_property(msg.PropertyId.SENDER_EMAIL_ADDRESS, "build.agent@example.com")
message.set_property(msg.PropertyId.INTERNET_MESSAGE_ID, "<example-001@example.com>")

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

message.add_attachment("hello.txt", b"sample attachment\n", mime_type="text/plain")
message.save("example-message.msg")

Чтение и конвертация MSG в EML

Загрузить существующий .msg файл с MapiMessage.from_file() и преобразовать его в стандартный Python EmailMessage объект через to_email_message(). Затем сериализовать в байты EML для хранения или пересылки через SMTP.

from aspose.email_foss import msg

with msg.MapiMessage.from_file("example-message.msg") as loaded:
    email_message = loaded.to_email_message()
    eml_bytes = email_message.as_bytes()

with open("example-message.eml", "wb") as f:
    f.write(eml_bytes)

Исследование внутренней структуры MSG

Используйте MsgReader и его базовый CFBReader для анализа бинарной структуры файла MSG. Получите доступ к метаданным CFB (версия, размер сектора, количество записей каталога) и переберите записи свойств MAPI на бинарном уровне.

from aspose.email_foss import msg

reader = msg.MsgReader.from_file("example-message.msg")
cfb = reader.cfb_reader

print(f"CFB major_version={cfb.major_version}")
print(f"sector_size={cfb.sector_size}")
print(f"directory_entries={cfb.directory_entry_count}")

for entry in reader.iter_top_level_fixed_length_properties():
    tag = entry.property_tag
    print(f"tag=0x{tag:08X} flags=0x{entry.flags:08X} value={entry.value.hex()}")

reader.close()

Низкоуровневый доступ к CFB

Читать и обходить любой контейнер Compound File Binary, используя CFBReader. Перечислять хранилища и потоки, разрешать пути по имени и извлекать необработанные данные потока для пользовательской обработки.

from aspose.email_foss.cfb import CFBReader

reader = CFBReader.from_file("example-message.msg")

for entry in reader.iter_storages():
    print(f"Storage: {entry.name}")

for entry in reader.iter_streams():
    data = reader.get_stream_data(entry.stream_id)
    print(f"Stream: {entry.name} size={len(data)}")

reader.close()

Быстрый старт

Установите библиотеку и создайте свой первый MSG‑файл менее чем за десять строк:

pip install aspose-email-foss>=26.3
from aspose.email_foss import msg

message = msg.MapiMessage.create("Hello from Python", "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")

with msg.MapiMessage.from_file("hello.msg") as loaded:
    eml = loaded.to_email_message()
    print(eml["Subject"])

Поддерживаемые форматы

ФорматИмпортЭкспорт
MSGДаДа
CFBДаДа

Открытый исходный код и лицензирование

Aspose.Email FOSS for Python is released under the MIT License. Вы можете использовать его в личных, внутренних и коммерческих проектах без ограничений. Исходный код доступен на GitHub.


Начало работы