Introduction
Aspose.Email FOSS for .NET est une bibliothèque C# sous licence MIT, sans dépendances, pour travailler avec
Outlook MSG files, Compound File Binary (CFB) containers, et les messages EML. Cet article parcourt
chaque domaine de fonctionnalité majeur avec des exemples de code fonctionnels tirés directement de la suite de tests de la bibliothèque — chaque nom de classe et signature de méthode présentés ici sont vérifiés par rapport au
source repository.
Installez avec une seule commande — pas de Microsoft Outlook, pas d’interop COM, pas de bibliothèques natives :
dotnet add package Aspose.Email.Foss
Fonctionnalités clés
Lire et inspecter les fichiers MSG
MapiMessage.FromStream() et MapiMessage.FromFile() ouvrent n’importe quel fichier Outlook .msg et
exposent son contenu complet : sujet, corps en texte brut, corps HTML, nom de l’expéditeur, adresse e‑mail
de l’expéditeur, heure de livraison, identifiant de message Internet, destinataires et pièces jointes. Aucun Outlook
n’est requis — l’ensemble de la couche MSG et CFB est implémenté en C# géré.
using System.IO;
using Aspose.Email.Foss.Msg;
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.Body);
foreach (var recipient in message.Recipients)
Console.WriteLine($"To: {recipient.EmailAddress}");
foreach (var attachment in message.Attachments)
Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");
Créer des fichiers MSG à partir de zéro
MapiMessage.Create() crée un e‑mail complet en mémoire. Définissez SenderName,
SenderEmailAddress, HtmlBody, InternetMessageId et MessageDeliveryTime comme
propriétés après la création, puis ajoutez des destinataires avec AddRecipient() et des pièces jointes de fichier ou de flux
avec AddAttachment(). Sérialisez avec message.Save() — renvoie un byte[]
ou écrit directement vers un chemin ou Stream.
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");
message.AddAttachment("note.txt", "abc"u8.ToArray(), "text/plain");
using var output = File.Create("hello.msg");
message.Save(output);
Convertir EML en MSG (et retour)
MapiMessage.LoadFromEml() accepte un chemin de fichier, un Stream ou un byte[] contenant un
message RFC 5322 / MIME standard. L’analyseur MIME intégré préserve l’objet, le corps en texte brut,
le corps HTML, l’expéditeur, les destinataires et toutes les pièces jointes — y compris les images en ligne avec
les en‑têtes Content-ID. SaveToEml() sérialise de nouveau en MIME pour des allers‑retours complets EML ↔ MSG
sans aucune bibliothèque MIME externe.
using System.IO;
using Aspose.Email.Foss.Msg;
using var input = File.OpenRead("message.eml");
var message = MapiMessage.LoadFromEml(input);
// Inspect fields parsed from MIME headers
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
Console.WriteLine(message.HtmlBody);
// Save as MSG for Outlook-compatible storage
using var msgOutput = File.Create("message.msg");
message.Save(msgOutput);
// Round-trip back to EML
using var emlOutput = File.Create("roundtrip.eml");
message.SaveToEml(emlOutput);
Pièces jointes de messages intégrés
Un fichier MSG peut contenir un autre fichier MSG en tant que pièce jointe — un schéma courant dans les chaînes d’e‑mails transférés. AddEmbeddedMessageAttachment() attache un objet MapiMessage en tant que pièce jointe imbriquée .msg. Lors de la lecture, MapiAttachment.IsEmbeddedMessage signale le type incorporé et EmbeddedMessage expose directement le MapiMessage imbriqué.
using System.IO;
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");
var loaded = MapiMessage.FromFile("outer.msg");
var attachment = loaded.Attachments[0];
if (attachment.IsEmbeddedMessage)
Console.WriteLine($"Embedded subject: {attachment.EmbeddedMessage!.Subject}");
Lecture et écriture du conteneur CFB
Les fichiers Outlook MSG sont construits sur le format Compound File Binary (CFB) — un conteneur binaire hiérarchique similaire à un système de fichiers FAT. CfbReader expose l’arborescence complète du répertoire : parcourez les stockages et les flux avec IterChildren(), naviguez vers des entrées spécifiques par chaîne de chemin avec ResolvePath(), et lisez les octets bruts du flux avec GetStreamData(). CfbWriter.ToBytes() sérialise un CfbDocument en octets — utile pour créer des documents CFB personnalisés ou vérifier des allers‑retours sans perte.
using System.Text;
using Aspose.Email.Foss.Cfb;
// Build a CFB document from scratch
var document = new CfbDocument();
document.Root.AddStream(new CfbStream("ReadMe", 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);
// Read it back
using var reader = new CfbReader(bytes);
var entry = reader.ResolvePath(["DataStore", "Payload"]);
if (entry is not null)
{
var data = reader.GetStreamData(entry.StreamId);
Console.WriteLine(Encoding.UTF8.GetString(data)); // "content"
}
Accès aux propriétés MAPI typées
MapiPropertyCollection fournit un accès typé aux propriétés MAPI pour tout objet MSG ou de stockage.
L’énumération CommonMessagePropertyId couvre tous les identifiants de propriétés MAPI standard — Subject,Body, BodyHtml, SenderName, SenderEmailAddress, MessageDeliveryTime,InternetMessageId, ainsi que les propriétés des pièces jointes incluant AttachFilename, AttachMimeTag,
et AttachContentId. Utilisez SetProperty() et GetPropertyValue() pour lire et écrire
des propriétés arbitraires au‑delà des champs de commodité nommés sur MapiMessage.
using Aspose.Email.Foss.Msg;
var message = MapiMessage.FromFile("sample.msg");
// Typed 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}");
Démarrage rapide
dotnet add package Aspose.Email.Foss
using System.IO;
using Aspose.Email.Foss.Msg;
// Read an MSG file
using var stream = File.OpenRead("sample.msg");
var message = MapiMessage.FromStream(stream);
Console.WriteLine(message.Subject);
Console.WriteLine(message.SenderEmailAddress);
foreach (var recipient in message.Recipients)
Console.WriteLine($"To: {recipient.EmailAddress}");
foreach (var attachment in message.Attachments)
Console.WriteLine($"Attachment: {attachment.Filename} ({attachment.MimeType})");
Formats pris en charge
| Format | Extension | Lecture | Écriture |
|---|---|---|---|
| Fichier binaire composé | .cfb | ✓ | ✓ |
| Message Outlook | .msg | ✓ | ✓ |
| MIME / EML | .eml | ✓ | ✓ |
Open Source et licences
Aspose.Email FOSS pour .NET est publié sous la licence MIT. Utilisez‑le librement dans des projets personnels, commerciaux et open source sans aucune restriction d’utilisation. Le code source est disponible sur github.com/aspose-email-foss/Aspose.Email-FOSS-for-.Net.