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
| Formato | Importar | Exportar |
|---|---|---|
| MSG | Sí | Sí |
| CFB | Sí | Sí |
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.