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-fossfrom 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
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| 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.