Introducció

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.

A nivell del contenidor, el lector i l’escritor CFB us ofereixen un control determinista sobre els documents Compound File Binary. Podeu recórrer les jerarquies d’emmagatzematge, extreure dades de flux en brut, crear nous contenidors des de zero i serialitzar-los de nou a bytes. Ambdós CFBError i MsgError proporcionen una gestió d’excepcions estructurada per a entrades malformades.

Aquest article recorre cada capacitat amb exemples de codi verificats extrets directament del conjunt de proves i dels scripts d’exemple de la biblioteca.


Què s’inclou

Accés a propietats MAPI

Cada fitxer MSG es construeix sobre propietats MAPI. MapiMessage exposa set_property() i get_property() per treballar amb propietats pel seu PropertyId valor d’enumeració. Utilitzeu iter_properties() per enumerar totes les propietats d’un missatge, o get_property_value() per a la recuperació directa de valors amb decodificació de tipus opcional.

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

Per llegir les propietats d’un fitxer existent:

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

Destinataris i adjunts

Afegiu destinataris amb add_recipient(), especificant el nom per mostrar i el tipus de destinatari (To, CC, o BCC). Adjunta fitxers amb add_attachment() utilitzant bytes en brut i un tipus MIME. Per a missatges imbricats, add_embedded_message_attachment() insereix un complet MapiMessage com a objecte fill dins del pare.

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

Per inspeccionar els adjunts d’un missatge existent:

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

Conversió de MSG a EmailMessage

La biblioteca converteix en ambdues direccions entre MSG i els de Python’s email.message.EmailMessage. Utilitza to_email_message() per a produir un objecte MIME conforme a les normes, o from_email_message() per a importar un existent EmailMessage al format MSG. Mètodes de conveniència to_email_bytes() i to_email_string() serialitzen directament a bytes o text.

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

Viatge d’anada i tornada del contenidor CFB

Construeix i serialitza contenidors Compound File Binary de manera independent de la capa MSG. CFBDocument.from_file() carrega un contenidor existent en un model de document mutable amb CFBStorage i CFBStream nodes. CFBWriter.write_file() serialitza el document de tornada al disc de manera determinista.

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

Gestió d’errors

La biblioteca llança CFBError per a contingut CFB mal format i MsgError per a una estructura MSG invàlida. MapiMessage també exposa un validation_issues propietat que retorna una tupla de cadenes d’advertència sense llançar una excepció, permetent-te decidir com de estrictament gestionar fitxers no 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}")

Inici ràpid

pip install aspose-email-foss>=26.3

Carrega un MSG existent, llegeix les seves metadades i llista els fitxers adjunts:

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 compatibles

FormatImportarExportar
MSG
CFB

Codi obert i llicència

Aspose.Email FOSS for Python is released under the Llicència MIT. Podeu utilitzar-lo en projectes personals, interns i comercials sense restriccions. El codi font està disponible a GitHub.


Començar