Introduzione
L’analisi programmatica dei messaggi email è una necessità comune per strumenti di archiviazione, pipeline di conformità e utility di migrazione. I file Outlook MSG utilizzano il formato di contenitore Compound File Binary (CFB) con flussi di proprietà MAPI, mentre i file EML seguono lo standard MIME. Entrambi i formati richiedono una gestione attenta delle codifiche, delle intestazioni piegate e degli allegati annidati.
Aspose.Email FOSS per .NET è una libreria C# gratuita, con licenza MIT, che fornisce un API completo di lettura-scrittura per i messaggi MSG ed EML. È destinata a .NET 8.0+ e non dipende da Microsoft Outlook né da alcun livello nativo di interop COM. La libreria è disponibile come pacchetto aspose.email.foss NuGet.
Questo post illustra le funzionalità di analisi dei messaggi incluse nella libreria, dal caricamento dei file dal disco all’estrazione delle singole proprietà MAPI e alla conversione tra i formati.
Cosa è incluso
Caricamento dei file MSG
La classe MapiMessage è il punto di ingresso principale per lavorare con i file Outlook MSG. È possibile caricare un messaggio da un percorso file o da uno stream, con un flag opzionale di validazione rigorosa che evidenzia eventuali problemi strutturali riscontrati nel file.
// Load an MSG file from disk
var message = MapiMessage.FromFile("meeting-invite.msg");
Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Recipients: {message.Recipients.Count}");
Console.WriteLine($"Attachments: {message.Attachments.Count}");
Il MapiMessage restituito espone proprietà tipizzate per i campi comuni, inclusi Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId e MessageDeliveryTime.
Caricamento dei messaggi EML
I file EML utilizzano il formato MIME. MapiMessage.LoadFromEml accetta un percorso file, un Stream o un byte[] e restituisce lo stesso oggetto MapiMessage, così utilizzi un unico API indipendentemente dal formato di origine.
// Load from a file path
var fromFile = MapiMessage.LoadFromEml("newsletter.eml");
// Load from a stream
using var stream = File.OpenRead("newsletter.eml");
var fromStream = MapiMessage.LoadFromEml(stream);
Console.WriteLine($"Subject: {fromStream.Subject}");
Console.WriteLine($"Body: {fromStream.Body?.Trim()}");
Il parser gestisce intestazioni piegate, le codifiche di trasferimento Base64 e quoted-printable, e i campi To/Cc per più destinatari.
Lavorare con destinatari e allegati
Una volta caricato un messaggio, i destinatari e gli allegati sono disponibili come collezioni fortemente tipizzate. Ogni MapiRecipient contiene i campi EmailAddress, DisplayName e RecipientType. Ogni MapiAttachment fornisce Filename, Data, MimeType e ContentId.
var message = MapiMessage.FromFile("report.msg");
foreach (var recipient in message.Recipients)
{
Console.WriteLine($" {recipient.DisplayName} <{recipient.EmailAddress}> (type={recipient.RecipientType})");
}
foreach (var attachment in message.Attachments)
{
Console.WriteLine($" {attachment.Filename} ({attachment.MimeType}, {attachment.Data.Length} bytes)");
File.WriteAllBytes(attachment.Filename!, attachment.Data);
}
Sono supportati anche gli allegati di messaggi incorporati. Quando MapiAttachment.IsEmbeddedMessage è true, la proprietà EmbeddedMessage restituisce un MapiMessage annidato che puoi ispezionare ricorsivamente.
Accesso alle proprietà MAPI
Per scenari avanzati, ogni messaggio, destinatario e allegato espone una collezione Properties di tipo MapiPropertyCollection. È possibile leggere, aggiungere e rimuovere singole proprietà MAPI tramite il loro ID proprietà e il codice tipo.
var message = MapiMessage.FromFile("custom-props.msg");
// Iterate all properties on the message
foreach (var prop in message.Properties.IterProperties())
{
Console.WriteLine($"Tag: 0x{prop.PropertyTag:X8}, Value: {prop.Value}");
}
// Read a specific property
var subject = message.Properties.Get(
(ushort)CommonMessagePropertyId.Subject,
(ushort)PropertyTypeCode.PtypString);
L’enum CommonMessagePropertyId definisce gli identificatori di proprietà MAPI ben noti per la semantica di base dei messaggi, i campi del corpo, le intestazioni di trasporto e i metadati degli allegati.
Conversione tra MSG ed EML
Un messaggio analizzato può essere salvato nuovamente in uno dei due formati. Save() scrive i byte MSG, mentre SaveToEml() genera output MIME. Questo rende la conversione dei formati semplice.
// Load an EML and save as MSG
var message = MapiMessage.LoadFromEml("incoming.eml");
message.Save("converted.msg");
// Load an MSG and save as EML
var msg = MapiMessage.FromFile("outgoing.msg");
msg.SaveToEml("exported.eml");
Entrambi i metodi accettano anche un parametro Stream per l’elaborazione in memoria senza toccare il file system.
Guida rapida
Installa il pacchetto da NuGet:
dotnet add package Aspose.Email.FOSSQuindi analizza il tuo primo messaggio:
using Aspose.Email.Foss.Msg;
// Load an MSG file
var message = MapiMessage.FromFile("sample.msg");
Console.WriteLine($"Subject: {message.Subject}");
Console.WriteLine($"From: {message.SenderName} <{message.SenderEmailAddress}>");
Console.WriteLine($"Date: {message.MessageDeliveryTime}");
Console.WriteLine($"Body length: {message.Body?.Length ?? 0} chars");
// List attachments
foreach (var att in message.Attachments)
Console.WriteLine($" Attachment: {att.Filename} ({att.Data.Length} bytes)");
// Convert to EML
message.SaveToEml("sample.eml");
Console.WriteLine("Saved as EML.");
Formati supportati
| Formato | Estensione | Leggi | Scrivi |
|---|---|---|---|
| Outlook MSG | .msg | Sì | Sì |
| MIME (EML) | .eml | Sì | Sì |
| Compound File Binary | .cfb | Sì | Sì |
Open Source e licenze
Aspose.Email FOSS per .NET è rilasciato sotto licenza MIT. Il codice sorgente completo è disponibile su GitHub a aspose-email-foss/Aspose.Email-FOSS-for-.Net. Contributi, segnalazioni di problemi e pull request sono benvenuti.
Iniziare
- Guida per sviluppatori — documentazione dettagliata e guide passo-passo
- Base di conoscenza — FAQ e articoli pratici
- API Reference — riferimento completo di classi e metodi