Introduction

Aspose.Email FOSS for Python goes beyond basic message creation. The library exposes the full depth of the MAPI property model, letting you read, write, and query individual properties by ID and type. It handles recipients, attachments, and embedded messages as first-class objects, and provides bidirectional conversion between the MSG binary format and Python’s standard email.message.EmailMessage.

Au niveau du conteneur, le lecteur et l’écrivain CFB vous offrent un contrôle déterministe sur les documents Compound File Binary. Vous pouvez parcourir les hiérarchies de stockage, extraire les données brutes du flux, créer de nouveaux conteneurs à partir de zéro, et les sérialiser en octets. Les deux CFBError et MsgError offrent une gestion structurée des exceptions pour les entrées malformées.

Cet article parcourt chaque fonctionnalité avec des exemples de code vérifiés tirés directement de la suite de tests et des scripts d’exemple de la bibliothèque.


Ce qui est inclus

Accès aux propriétés MAPI

Chaque fichier MSG est construit sur les propriétés MAPI. MapiMessage expose set_property() et get_property() pour travailler avec les propriétés par leur PropertyId valeur d’énumération. Utilisez iter_properties() pour énumérer toutes les propriétés d’un message, ou get_property_value() pour récupérer directement la valeur avec un décodage de type optionnel.

from aspose.email_foss import msg

message = msg.MapiMessage.create("Status report", "Weekly update attached.")

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.DISPLAY_TO, "Alice Example; Bob Example")
message.set_property(msg.PropertyId.DISPLAY_CC, "Carol Example")
message.set_property(msg.PropertyId.DISPLAY_BCC, "Ops Archive")
message.set_property(
    msg.PropertyId.TRANSPORT_MESSAGE_HEADERS,
    "X-Environment: production\nX-Workflow: weekly-report\n",
)
message.save("report.msg")

Pour lire les propriétés d’un fichier existant :

from aspose.email_foss import msg

with msg.MapiMessage.from_file("report.msg") as loaded:
    print(f"Subject: {loaded.subject}")
    print(f"Body: {loaded.body}")

    for prop in loaded.iter_properties():
        print(f"tag=0x{prop.property_tag:08X}")

Destinataires et pièces jointes

Ajoutez des destinataires avec add_recipient(), en spécifiant le nom d’affichage et le type de destinataire (À, CC ou CCI). Joindre des fichiers avec add_attachment() en utilisant des octets bruts et un type MIME. Pour les messages imbriqués, add_embedded_message_attachment() intègre un complet MapiMessage en tant qu’objet enfant à l’intérieur du parent.

from aspose.email_foss import msg

message = msg.MapiMessage.create("Team update", "See attached notes.")

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_recipient(
    "archive@example.com",
    display_name="Ops Archive",
    recipient_type=msg.RECIPIENT_TYPE_BCC,
)

message.add_attachment("notes.txt", b"Meeting notes content\n", mime_type="text/plain")
message.add_attachment("data.bin", b"\x00\x01\x02\x03", mime_type="application/octet-stream")
message.save("team-update.msg")

Pour inspecter les pièces jointes d’un message existant :

from aspose.email_foss import msg

with msg.MapiMessage.from_file("team-update.msg") as loaded:
    for att in loaded.iter_attachments_info():
        print(f"name={att.filename} mime={att.mime_type} size={len(att.data)}")
        print(f"  embedded={att.is_embedded_message} storage={att.storage_name}")

Conversion MSG vers EmailMessage

La bibliothèque convertit dans les deux sens entre MSG et Python’s email.message.EmailMessage. Utilisez to_email_message() pour produire un objet MIME conforme aux normes, ou from_email_message() pour importer un existant EmailMessage dans le format MSG. Les méthodes pratiques to_email_bytes() et to_email_string() sérialisent directement en octets ou en texte.

from aspose.email_foss import msg

with msg.MapiMessage.from_file("example.msg") as loaded:
    email_msg = loaded.to_email_message()

    print(f"content_type: {email_msg.get_content_type()}")
    print(f"is_multipart: {email_msg.is_multipart()}")
    print(f"headers: {len(email_msg)}")

    for key, value in email_msg.items():
        print(f"  {key}: {value}")

    body_part = email_msg.get_body(preferencelist=("plain", "html"))
    if body_part is not None:
        print(f"body: {body_part.get_content()[:200]}")

Aller-retour du conteneur CFB

Construire et sérialiser des conteneurs Compound File Binary de manière indépendante de la couche MSG. CFBDocument.from_file() charge un conteneur existant dans un modèle de document mutable avec CFBStorage et CFBStream nœuds. CFBWriter.write_file() sérialise le document de nouveau sur le disque de façon déterministe.

from aspose.email_foss.cfb import CFBDocument, CFBReader, CFBWriter

reader = CFBReader.from_file("container.cfb")
document = CFBDocument.from_reader(reader)
reader.close()

output = CFBWriter.to_bytes(document)
print(f"Serialized {len(output)} bytes")

Gestion des erreurs

La bibliothèque lève CFBError pour un contenu CFB malformé et MsgError pour une structure MSG invalide. MapiMessage expose également un validation_issues propriété qui renvoie un tuple de chaînes d’avertissement sans lever d’exception, vous permettant de décider à quel point vous souhaitez gérer strictement les fichiers non conformes.

from aspose.email_foss.cfb import CFBReader, CFBError
from aspose.email_foss.msg import MsgReader, MsgError

try:
    reader = CFBReader.from_file("corrupted.cfb")
except CFBError as e:
    print(f"CFB parse error: {e}")

try:
    reader = MsgReader.from_file("malformed.msg")
except MsgError as e:
    print(f"MSG parse error: {e}")

Démarrage rapide

pip install aspose-email-foss>=26.3

Chargez un MSG existant, lisez ses métadonnées et répertoriez les pièces jointes :

from aspose.email_foss import msg

with msg.MapiMessage.from_file("inbox-message.msg") as message:
    print(f"Subject: {message.subject}")
    print(f"Body preview: {message.body[:200] if message.body else '(empty)'}")

    for att in message.iter_attachments_info():
        print(f"Attachment: {att.filename} ({att.mime_type}, {len(att.data)} bytes)")

    issues = message.validation_issues
    if issues:
        print(f"Warnings: {issues}")

Formats pris en charge

FormatImporterExporter
MSGOuiOui
CFBOuiOui

Open Source & Licence

Aspose.Email FOSS for Python is released under the Licence MIT. Vous pouvez l’utiliser dans des projets personnels, internes et commerciaux sans restriction. Le code source est disponible sur GitHub.


Premiers pas