Caratteristiche e funzionalità

Caratteristiche e funzionalità

Caratteristiche e funzionalità

Questa pagina copre tutte le principali funzionalità di Aspose.Email FOSS for .NET con esempi funzionanti in C#.


Lettura di file MSG

Carica un file MSG da un percorso o da uno stream e accedi a tutte le sue proprietà:

using System.IO;
using Aspose.Email.Foss.Msg;

using var stream = File.OpenRead("message.msg");
var message = MapiMessage.FromStream(stream);

Console.WriteLine(message.Subject);
Console.WriteLine(message.Body);
Console.WriteLine(message.HtmlBody);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.MessageDeliveryTime);
Console.WriteLine(message.InternetMessageId);

Usa strict: false per l’analisi permissiva di file MSG non standard:

var message = MapiMessage.FromFile("message.msg", strict: false);

Controlla ValidationIssues per esaminare eventuali avvisi di formato senza lanciare:

foreach (var issue in message.ValidationIssues)
    Console.WriteLine($"Warning: {issue}");

Creazione di file MSG

Crea un’email completa con MapiMessage.Create() e serializzala con Save():

using System.IO;
using Aspose.Email.Foss.Msg;

var message = MapiMessage.Create("Hello", "Body");
message.SenderName = "Alice";
message.SenderEmailAddress = "alice@example.com";
message.HtmlBody = "<p>Body</p>";
message.InternetMessageId = "<hello@example.com>";
message.MessageDeliveryTime = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc);

message.AddRecipient("bob@example.com", "Bob");

using var output = File.Create("hello.msg");
message.Save(output);

Save() senza argomenti restituisce un byte[]. Save(path) scrive direttamente su un percorso file.


Destinatari

Aggiungi i destinatari To, Cc e Bcc con AddRecipient():

message.AddRecipient("alice@example.com", "Alice");
message.AddRecipient("bob@example.com", "Bob", MapiMessage.RecipientTypeCc);
message.AddRecipient("carol@example.com", "Carol", MapiMessage.RecipientTypeBcc);

Itera i destinatari da un messaggio caricato:

foreach (var recipient in message.Recipients)
    Console.WriteLine($"{recipient.DisplayName} <{recipient.EmailAddress}>");

Allegati

Aggiungi allegati di file o stream con metadati:

// From byte array
message.AddAttachment("report.pdf", pdfBytes, "application/pdf");

// From stream
using var attachStream = File.OpenRead("photo.png");
message.AddAttachment("photo.png", attachStream, "image/png");

// Inline image with Content-ID
message.AddAttachment("logo.png", logoBytes, "image/png", contentId: "logo@cid");

Leggi gli allegati da un messaggio caricato:

foreach (var attachment in message.Attachments)
{
    Console.WriteLine($"Filename: {attachment.Filename}");
    Console.WriteLine($"MIME type: {attachment.MimeType}");
    Console.WriteLine($"Size: {attachment.Data.Length} bytes");
    File.WriteAllBytes(attachment.Filename!, attachment.Data);
}

Allegati dei messaggi incorporati

Allega un MapiMessage dentro un altro — comune nelle catene di email inoltrate:

using Aspose.Email.Foss.Msg;

var parent = MapiMessage.Create("Outer", "Parent body");
var child = MapiMessage.Create("Inner", "Child body");
child.SenderEmailAddress = "inner@example.com";
parent.AddEmbeddedMessageAttachment(child, "inner.msg");

parent.Save("outer.msg");

Leggi gli allegati dei messaggi incorporati:

var loaded = MapiMessage.FromFile("outer.msg");
foreach (var attachment in loaded.Attachments)
{
    if (attachment.IsEmbeddedMessage)
    {
        Console.WriteLine($"Embedded: {attachment.EmbeddedMessage!.Subject}");
    }
}

Conversione EML e MIME

Carica un file RFC 5322 .eml in un MapiMessage per l’archiviazione compatibile con Outlook:

using System.IO;
using Aspose.Email.Foss.Msg;

using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);

using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);

Converti nuovamente in EML da un file MSG:

var message = MapiMessage.FromFile("message.msg");
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);

LoadFromEml() accetta anche un percorso string o byte[]. SaveToEml() senza argomenti restituisce un byte[]. Oggetto, corpo, corpo HTML, mittente, destinatari e tutti gli allegati (incluse le immagini in linea con Content-ID) sono preservati durante i round‑trip completi EML ↔ MSG.


Accesso alle proprietà MAPI

MapiPropertyCollection fornisce accesso tipizzato alle proprietà MAPI tramite SetProperty() e GetPropertyValue(). Utilizza i valori enum CommonMessagePropertyId per le proprietà standard:

using Aspose.Email.Foss.Msg;

var message = MapiMessage.FromFile("sample.msg");

// Named convenience properties
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderName);
Console.WriteLine(message.MessageDeliveryTime);

// Iterate all MAPI property keys
foreach (var key in message.IterPropertyKeys())
    Console.WriteLine($"0x{(ushort)key.PropertyId:X4} / {key.PropertyType}");

Accesso al contenitore CFB

I file MSG di Outlook sono basati sul formato Compound File Binary (CFB). CfbReader espone l’intero albero delle directory per l’ispezione e l’estrazione dei dati:

using System.Text;
using Aspose.Email.Foss.Cfb;

using var reader = CfbReader.FromFile("message.msg");

// Iterate all top-level children
foreach (var entry in reader.IterChildren(CfbConstants.RootStreamId))
    Console.WriteLine($"{(entry.IsStorage() ? "Storage" : "Stream")}: {entry.Name}");

// Navigate to a specific stream by path
var entry2 = reader.ResolvePath(["__substg1.0_0037001E"]);
if (entry2 is not null)
{
    var data = reader.GetStreamData(entry2.StreamId);
    Console.WriteLine(Encoding.Unicode.GetString(data));
}

Crea e serializza un documento CFB da zero con CfbWriter:

using System.Text;
using Aspose.Email.Foss.Cfb;

var document = new CfbDocument();
document.Root.AddStream(new CfbStream("Notes", Encoding.UTF8.GetBytes("hello")));
var storage = document.Root.AddStorage(new CfbStorage("DataStore"));
storage.AddStream(new CfbStream("Payload", Encoding.UTF8.GetBytes("content")));

byte[] bytes = CfbWriter.ToBytes(document);
File.WriteAllBytes("output.cfb", bytes);

Suggerimenti e migliori pratiche

  • Usa using o Dispose() su MapiMessage e CfbReader per rilasciare i handle dei file
  • Controlla message.ValidationIssues dopo il caricamento per rilevare formattazione MSG non standard
  • Il parametro strict in FromFile() / FromStream() controlla la tolleranza agli errori — usa
    strict: false per un parsing permissivo dei file provenienti da sistemi di terze parti
  • MapiMessage.Create() genera messaggi Unicode-string per impostazione predefinita; imposta unicodeStrings: false
    per la compatibilità legacy ANSI
  • SaveToEml() senza argomenti restituisce byte[] — comodo per flussi di lavoro in memoria

Problemi comuni

IssueCauseFix
CfbException durante il caricamentoFile CFB/MSG non validoVerificare che il file sia un Outlook MSG
Body vuoto dopo il caricamentoCorpo memorizzato solo in HTMLControllare message.HtmlBody invece
0 allegati dopo LoadFromEmlEML non ha parti Content-Disposition: attachmentLe parti inline (solo Content-ID) compaiono anche in Attachments

Sommario del Riferimento API

ClassDescription
MapiMessageRappresentazione del messaggio MSG ad alto livello
MapiAttachmentAllegato o messaggio incorporato su un MapiMessage
MapiRecipientDestinatario su un MapiMessage
MapiPropertySingola voce di proprietà MAPI
MapiPropertyCollectionContenitore di proprietà MAPI tipizzato
CommonMessagePropertyIdEnum dei identificatori di proprietà MAPI standard
MsgReaderLettore della struttura MSG a basso livello
MsgWriterScrittore della struttura MSG a basso livello
CfbReaderLettore del contenitore binario CFB
CfbWriterScrittore del contenitore binario CFB
CfbDocumentDocumento CFB in memoria per la costruzione
CfbStorageNodo di archiviazione in un documento CFB
CfbStreamNodo di flusso in un documento CFB
 Italiano