Introduzione

Aspose.Email FOSS for Python è una libreria gratuita, con licenza MIT, per creare, leggere e convertire file di messaggi compatibili con Outlook in puro Python. Disponibile su PyPI come aspose-email-foss, funziona su Windows, macOS, Linux, Docker e ambienti serverless senza dipendenza da Microsoft Office e senza runtime proprietario.

La libreria copre due aree principali: uno strato MAPI di alto livello (MapiMessage) per gestire oggetti, corpi, destinatari e allegati dei messaggi; e uno strato strutturale di basso livello (MsgReader, CFBReader, CFBStorage, CFBStream) che espone i contenitori grezzi Compound File Binary alla base di ogni file .msg.

Questo articolo illustra le caratteristiche principali incluse nella versione 26.3, basate sulla superficie confermata di API.


Caratteristiche principali

Creazione di messaggi di alto livello con MapiMessage

MapiMessage è il punto di ingresso principale per creare messaggi compatibili con Outlook da zero. Chiamare MapiMessage.create() con oggetto e corpo, aggiungere destinatari e allegati, quindi salvare direttamente in un file .msg.

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

Lettura e ispezione dei file MSG

MsgReader fornisce accesso strutturato a un file .msg esistente senza caricarlo completamente in un MapiMessage. Espone le voci di proprietà di livello superiore, gli archivi dei destinatari e gli archivi degli allegati singolarmente, rendendolo pratico per l’ispezione di file di grandi dimensioni e le pipeline di validazione.

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: Carica, Modifica, Salva

Poiché MapiMessage supporta from_file() per il caricamento e save() per la scrittura, un ciclo completo di lettura-modifica-scrittura richiede solo poche righe. Proprietà con nome, enum tipizzati e gestione delle stringhe Unicode sono disponibili tramite set_property, PropertyId e 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")

Conversione EML / RFC 5322

MapiMessage.to_email_message() converte un MSG caricato in un oggetto standard Python email.message.EmailMessage, consentendo l’esportazione nel formato .eml RFC 5322 utilizzando la libreria standard. La direzione inversa (MapiMessage.from_email_message()) costruisce un MapiMessage da un 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")

Scansione del contenitore CFB

Ogni file .msg è un contenitore Compound File Binary (CFB). CFBReader fornisce accesso in sola lettura all’albero delle directory, consentendo di elencare archivi e stream, percorrere la gerarchia ed estrarre i byte grezzi dello stream — senza fare affidamento su 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}]")

Gestione degli allegati

Gli allegati vengono aggiunti tramite MapiMessage.add_attachment() (per dati binari) o MapiMessage.add_embedded_message_attachment() (per messaggi MSG nidificati). Entrambi i metodi accettano un nome file, byte grezzi e un tipo MIME facoltativo.

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

Avvio rapido

pip install aspose-email-foss
from 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)

Formati supportati

FormatoEstensioneLeggiScrivi
Compound File Binary.cfb
Messaggio Outlook.msg
EML / RFC 5322.eml

Open Source e Licenze

Aspose.Email FOSS per Python è rilasciato sotto la Licenza MIT. Il repository sorgente è disponibile su github.com/aspose-email-foss e il pacchetto è pubblicato su PyPI come aspose-email-foss. L’uso commerciale, la modifica e la ridistribuzione sono tutti consentiti ai sensi dei termini MIT.


Per iniziare

Risorse correlate