Fonctionnalités et capacités

Fonctionnalités et capacités

Fonctionnalités et capacités

Cette page couvre chaque fonctionnalité majeure de Aspose.Email FOSS for .NET avec des exemples C# fonctionnels.


Lecture des fichiers MSG

Chargez un fichier MSG à partir d’un chemin ou d’un flux et accédez à toutes ses propriétés :

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

Utilisez strict: false pour une analyse tolérante des fichiers MSG non standard :

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

Vérifiez ValidationIssues pour examiner les éventuels avertissements de format sans lever d’exception :

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

Création de fichiers MSG

Construisez un e‑mail complet avec MapiMessage.Create() et sérialisez‑le avec 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() sans arguments renvoie un byte[]. Save(path) écrit directement vers un chemin de fichier.


Destinataires

Ajouter les destinataires To, Cc et Bcc avec AddRecipient() :

message.AddRecipient("alice@example.com", "Alice");
message.AddRecipient("bob@example.com", "Bob", RecipientType.Cc);
message.AddRecipient("carol@example.com", "Carol", RecipientType.Bcc);

Itérer les destinataires d’un message chargé :

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

Pièces jointes

Ajouter des pièces jointes de fichier ou de flux avec des métadonnées :

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

Lire les pièces jointes d’un message chargé :

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);
}

Pièces jointes de messages intégrés

Attachez un MapiMessage à l’intérieur d’un autre — courant dans les chaînes d’e‑mails transférés :

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

Lire les pièces jointes du message intégré :

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

Conversion EML et MIME

Chargez un fichier RFC 5322 .eml dans un MapiMessage pour un stockage compatible 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);

Convertir en EML à partir d’un fichier MSG :

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

LoadFromEml() accepte également un chemin string ou byte[]. SaveToEml() sans arguments renvoie un byte[]. Le sujet, le corps, le corps HTML, l’expéditeur, les destinataires et toutes les pièces jointes (y compris les images en ligne avec Content-ID) sont conservés lors de cycles complets EML ↔ MSG.


Accès aux propriétés MAPI

MapiPropertyCollection fournit un accès typé aux propriétés MAPI via SetProperty() et GetPropertyValue(). Utilisez les valeurs d’énumération CommonMessagePropertyId pour les propriétés 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}");

CFB Accès au conteneur

Les fichiers Outlook MSG sont construits sur le format Compound File Binary (CFB). CfbReader expose l’arborescence complète du répertoire pour l’inspection et l’extraction de données :

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));
}

Construire et sérialiser un document CFB à partir de zéro avec 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);

Conseils et meilleures pratiques

  • Utilisez using ou Dispose() sur MapiMessage et CfbReader pour libérer les poignées de fichier
  • Vérifiez message.ValidationIssues après le chargement pour détecter un format MSG non standard
  • Le paramètre strict dans FromFile() / FromStream() contrôle la tolérance aux erreurs — utilisez strict: false pour une analyse souple des fichiers provenant de systèmes tiers
  • MapiMessage.Create() génère des messages sous forme de chaînes Unicode par défaut ; définissez unicodeStrings: false pour la compatibilité ANSI héritée
  • SaveToEml() sans arguments renvoie byte[] — pratique pour les flux de travail en mémoire

Problèmes courants

ProblèmeCauseCorrection
CfbException lors du chargementFichier CFB/MSG non valideVérifiez que le fichier est un Outlook MSG
Body vide après le chargementCorps stocké uniquement en HTMLVérifiez message.HtmlBody à la place
0 pièces jointes après LoadFromEmlLe fichier EML ne contient pas de parties Content-Disposition: attachmentLes parties en ligne (uniquement Content-ID) apparaissent également dans Attachments

Résumé de la référence API

ClasseDescription
MapiMessageReprésentation de message MSG de haut niveau
MapiAttachmentPièce jointe ou message incorporé sur un MapiMessage
MapiRecipientDestinataire sur un MapiMessage
MapiPropertyEntrée de propriété MAPI unique
MapiPropertyCollectionSac de propriétés MAPI typé
CommonMessagePropertyIdÉnumération des identifiants de propriétés MAPI standard
MsgReaderLecteur de structure MSG de bas niveau
MsgWriterÉcrivain de structure MSG de bas niveau
CfbReaderLecteur de conteneur binaire CFB
CfbWriterÉcrivain de conteneur binaire CFB
CfbDocumentDocument CFB en mémoire pour la construction
CfbStorageNœud de stockage dans un document CFB
CfbStreamNœud de flux dans un document CFB
 Français