Inleiding
Aspose.Email FOSS voor Python is een gratis, MIT-gelicentieerde bibliotheek voor het maken, lezen en converteren van Outlook-compatibele berichtbestanden in pure Python. Beschikbaar op PyPI als aspose-email-foss, werkt het op Windows, macOS, Linux, Docker en serverless omgevingen zonder afhankelijkheid van Microsoft Office en zonder propriëtaire runtime.
De bibliotheek bestrijkt twee hoofdgebieden: een high-level MAPI-laag (MapiMessage) voor het werken met berichtonderwerpen, -inhoud, ontvangers en bijlagen; en een low-level structurele laag (MsgReader, CFBReader, CFBStorage, CFBStream) die de ruwe Compound File Binary-containers blootlegt die ten grondslag liggen aan elk .msg-bestand.
Dit artikel loopt de belangrijkste functies door die zijn meegeleverd in versie 26.3, gebaseerd op het bevestigde API-oppervlak.
Belangrijkste functies
High-Level berichtcreatie met MapiMessage
MapiMessage is het primaire toegangspunt voor het maken van Outlook-compatibele berichten vanaf nul. Roep MapiMessage.create() aan met een onderwerp en inhoud, voeg ontvangers en bijlagen toe, en sla vervolgens direct op in een .msg-bestand.
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")
Lezen en Inspecteren van MSG-bestanden
MsgReader biedt gestructureerde toegang tot een bestaand .msg-bestand zonder het volledig te laden in een MapiMessage. Het maakt top-level eigenschapvermeldingen, ontvangeropslag en bijlageopslag afzonderlijk toegankelijk, waardoor het praktisch is voor inspectie van grote bestanden en validatie-pijplijnen.
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 Round-Trip: Laden, Wijzigen, Opslaan
Omdat MapiMessage from_file() ondersteunt voor het laden en save() voor het schrijven, vereist een volledige lees-wijzig-schrijfcyclus slechts enkele regels. Benoemde eigenschappen, getypeerde enumeraties en Unicode-stringverwerking zijn beschikbaar via set_property, PropertyId en 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")
EML / RFC 5322 Conversie
MapiMessage.to_email_message() converteert een geladen MSG naar een standaard Python email.message.EmailMessage-object, waardoor export naar RFC 5322 .eml-formaat mogelijk is met de standaardbibliotheek. De omgekeerde richting (MapiMessage.from_email_message()) bouwt een MapiMessage op uit een 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")
CFB-containertraversie
Elk .msg-bestand is een Compound File Binary (CFB)-container. CFBReader biedt alleen-lezen toegang tot de directory-boom, waardoor je opslagplaatsen en streams kunt opsommen, door de hiërarchie kunt lopen en ruwe stream-bytes kunt extraheren — zonder afhankelijk te zijn van 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}]")
Bijlageverwerking
Bijlagen worden toegevoegd via MapiMessage.add_attachment() (voor binaire gegevens) of MapiMessage.add_embedded_message_attachment() (voor geneste MSG-berichten). Beide methoden accepteren een bestandsnaam, ruwe bytes en een optioneel MIME-type.
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")
Snelstart
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)
Ondersteunde formaten
| Formaat | Extensie | Lezen | Schrijven |
|---|---|---|---|
| Compound File Binary | .cfb | ✓ | ✓ |
| Outlook-bericht | .msg | ✓ | ✓ |
| EML / RFC 5322 | .eml | ✓ | ✓ |
Open source & licenties
Aspose.Email FOSS voor Python is uitgebracht onder de MIT-licentie. De bronrepository is beschikbaar op github.com/aspose-email-foss en het pakket wordt gepubliceerd op PyPI als aspose-email-foss. Commercieel gebruik, wijziging en herdistributie zijn allemaal toegestaan onder de MIT-voorwaarden.