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

FormatExtensionLectureÉ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.


Démarrage