Wprowadzenie

Aspose.Email FOSS for Python jest darmową, licencjonowaną na licencji MIT biblioteką do tworzenia, odczytywania i konwertowania plików wiadomości zgodnych z Outlook w czystym Python. Dostępna na PyPI jako aspose-email-foss, działa na Windows, macOS, Linux, Docker oraz w środowiskach serverless bez zależności od Microsoft Office i bez własnego środowiska uruchomieniowego.

Biblioteka obejmuje dwa główne obszary: warstwę wysokiego poziomu MAPI (MapiMessage) do pracy z tematami wiadomości, treściami, odbiorcami i załącznikami; oraz warstwę niskiego poziomu strukturalnego (MsgReader, CFBReader, CFBStorage, CFBStream), która udostępnia surowe kontenery Compound File Binary będące podstawą każdego pliku .msg.

Ten artykuł przechodzi przez kluczowe funkcje dostarczone w wersji 26.3, oparte na zweryfikowanym interfejsie API.


Kluczowe funkcje

Tworzenie wiadomości wysokiego poziomu przy użyciu MapiMessage

MapiMessage jest głównym punktem wejścia do tworzenia wiadomości zgodnych z Outlook od podstaw. Wywołaj MapiMessage.create() z tematem i treścią, dodaj odbiorców i załączniki, a następnie zapisz bezpośrednio do pliku .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")

Czytanie i przeglądanie plików MSG

MsgReader zapewnia strukturalny dostęp do istniejącego pliku .msg bez pełnego wczytywania go do MapiMessage. Udostępnia poszczególne wpisy właściwości najwyższego poziomu, magazyny odbiorców oraz magazyny załączników, co czyni ją praktyczną w przeglądzie dużych plików i pipeline’ach walidacji.

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")

Pełny cykl MSG: wczytaj, zmodyfikuj, zapisz

Ponieważ MapiMessage obsługuje from_file() do wczytywania i save() do zapisu, pełny cykl odczyt-modyfikacja-zapis wymaga zaledwie kilku wierszy. Nazwane właściwości, typowane wyliczenia oraz obsługa łańcuchów Unicode są dostępne poprzez set_property, PropertyId i MapiNamedProperty.

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")

Konwersja EML / RFC 5322

MapiMessage.to_email_message() konwertuje wczytany MSG na standardowy obiekt Python email.message.EmailMessage, umożliwiając eksport do formatu .eml RFC 5322 przy użyciu biblioteki standardowej. Odwrócony kierunek (MapiMessage.from_email_message()) tworzy MapiMessage z EmailMessage.

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")

Przeglądanie kontenera CFB

Każdy plik .msg jest kontenerem Compound File Binary (CFB). CFBReader zapewnia dostęp tylko do odczytu do drzewa katalogów, umożliwiając wymienianie magazynów i strumieni, przemierzanie hierarchii oraz wyodrębnianie surowych bajtów strumienia — bez polegania na 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}]")

Obsługa załączników

Załączniki są dodawane za pomocą MapiMessage.add_attachment() (dla danych binarnych) lub MapiMessage.add_embedded_message_attachment() (dla zagnieżdżonych wiadomości MSG). Obie metody przyjmują nazwę pliku, surowe bajty oraz opcjonalny typ 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")

Szybki start

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)

Obsługiwane formaty

FormatRozszerzenieOdczytZapis
Złożony plik binarny.cfb
Wiadomość Outlook.msg
EML / RFC 5322.eml

Open Source i licencjonowanie

Aspose.Email FOSS dla Python jest wydany na licencji MIT. Repozytorium źródłowe jest dostępne pod adresem github.com/aspose-email-foss, a pakiet jest opublikowany na PyPI jako aspose-email-foss. Komercyjne użycie, modyfikacja i redystrybucja są dozwolone na warunkach licencji MIT.


Rozpoczęcie

Powiązane zasoby