Introducción

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 nivel de contenedor, el lector y escritor CFB le brindan control determinista sobre documentos Compound File Binary. Puede recorrer jerarquías de almacenamiento, extraer datos de flujo sin procesar, crear nuevos contenedores desde cero y serializarlos de nuevo a bytes. Ambos CFBError y MsgError proporcionan manejo estructurado de excepciones para entradas malformadas.

Esta publicación recorre cada capacidad con ejemplos de código verificados extraídos directamente del propio conjunto de pruebas y scripts de ejemplo de la biblioteca.


Qué incluye

Acceso a Propiedades MAPI

Cada archivo MSG se construye sobre propiedades MAPI. MapiMessage expone set_property() y get_property() para trabajar con propiedades por su PropertyId valor enum. Utilice iter_properties() para enumerar todas las propiedades de un mensaje, o get_property_value() para la recuperación directa de valores con decodificación de tipo 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")

Para leer las propiedades de un archivo existente:

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

Destinatarios y Adjuntos

Agregar destinatarios con add_recipient(), especificando el nombre para mostrar y el tipo de destinatario (Para, CC o CCO). Adjunte archivos con add_attachment() usando bytes sin procesar y un tipo MIME. Para mensajes anidados, add_embedded_message_attachment() incorpora un completo MapiMessage como un objeto hijo dentro del padre.

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

Para inspeccionar los adjuntos de un mensaje existente:

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ón de MSG a EmailMessage

La biblioteca convierte en ambas direcciones entre MSG y Python’s email.message.EmailMessage. Use to_email_message() para producir un objeto MIME que cumpla con los estándares, o from_email_message() para importar un existente EmailMessage al formato MSG. Los métodos de conveniencia to_email_bytes() y to_email_string() serializan directamente a bytes o texto.

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

Recorrido de ida y vuelta del contenedor CFB

Construir y serializar contenedores Compound File Binary de forma independiente de la capa MSG. CFBDocument.from_file() carga un contenedor existente en un modelo de documento mutable con CFBStorage y CFBStream nodos. CFBWriter.write_file() serializa el documento de nuevo al disco 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")

Manejo de Errores

La biblioteca lanza CFBError para contenido CFB malformado y MsgError para una estructura MSG inválida. MapiMessage también expone un validation_issues propiedad que devuelve una tupla de cadenas de advertencia sin lanzar una excepción, permitiéndote decidir cuán estrictamente manejar archivos 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}")

Inicio rápido

pip install aspose-email-foss>=26.3

Carga un MSG existente, lee sus metadatos y enumera los adjuntos:

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

Formatos compatibles

FormatoImportarExportar
MSG
CFB

Código abierto y licencias

Aspose.Email FOSS for Python is released under the Licencia MIT. Puede usarlo en proyectos personales, internos y comerciales sin restricción. El código fuente está disponible en GitHub.


Primeros pasos