Introduction
Partage des messages électroniques programmés est un besoin commun pour les outils d’archivage, les pipelines de conformité et les utilités de migration. Les fichiers MSG Outlook utilisent le format de conteneur Compound File Binary (CFB) avec les flux propriétaires MAPI, tandis que les ficher EML suivent la norme MIME. Tous deux formats nécessitent une gestion soigneuse des codes, des heads en feuille et des annexes nuclées.
Aspose.Email FOSS for .NET is a free, MIT-licensed C# library that provides a complete read-write API for MSG and EML messages. It targets .NET 8.0+ and has no dependency on Microsoft Outlook or any native COM interop layer. The library is available as the aspose.email.foss Le paquet de NuGet.
Ce post passe par les capacités de partage des messages inclus dans la bibliothèque, du chargement des fichiers hors disque à l’extraction des propriétés individuelles MAPI et la conversion entre formats.
Ce qui est inclus
Réserver les fichiers MSG
Le MapiMessage classe est le point d’entrée principal pour travailler avec les fichiers MSG Outlook. Vous pouvez charger un message d’un chemin de fichier ou d ́une courant, avec une flamme strict validation facultative qui surmontre tout problème structurel trouvé dans le fichie.
// 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}");
Le retourné MapiMessage exposer des propriétés typiques pour les champs communs, y compris Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId,et MessageDeliveryTime.
Les messages EML
Les fichiers EML utilisent le format MIME. MapiMessage.LoadFromEml Il est possible de faire un fichier, a Stream,ou A byte[] Il revient le même MapiMessage objet, vous utilisez donc une API unifiée indépendamment du format source.
// 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()}");
Le parser gère les heads en fold, Base64 et codes de transfert imprimables cités, ainsi que les champs To/Cc multi-récepteurs.
Travailler avec les récepteurs et les attachements
Une fois un message chargé, les reçus et les annexes sont disponibles en tant que collections fortement typiées. MapiRecipient Porter EmailAddress, DisplayName,et RecipientType Les champs, chacun MapiAttachment Fournir Filename, Data, MimeType,et 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);
}
Les messages intégrés sont également supportés. lorsque MapiAttachment.IsEmbeddedMessage est true,Et le EmbeddedMessage La propriété revient à un nid MapiMessage Vous pouvez le vérifier de manière récurrente.
Propriétés MAPI Access
Pour les scénarios avancés, chaque message, récepteur et attachement expose un Properties Collection de type MapiPropertyCollection.Vous pouvez lire, ajouter et supprimer les propriétés individuelles de MAPI par leur ID de propriété et code de type.
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);
Le CommonMessagePropertyId Enum définit les identifiants de propriété MAPI connus pour les semantiques du message cible, les champs corporels, le nombre de transport et les métadonnées d’annexe.
Conversion entre MSG et EML
Un message parsé peut être sauvé dans n’importe quel format. Save() Il écrit des bytes MSG, alors que SaveToEml() produisent la sortie MIME. Cela rend la conversion de format simple.
// 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");
Les deux méthodes acceptent également un Stream paramètre pour le traitement en mémoire sans toucher le système de fichiers.
Démarrage rapide
Installez le package depuis NuGet :
dotnet add package Aspose.Email.FOSSPuis, parlez-en à votre premier message :
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.");
Formats soutenus
| Formats | Extension | Lire | Écrire |
|---|---|---|---|
| Mise en œuvre MSG | .msg | Oui | Oui |
| MIME (EML) | .eml | Oui | Oui |
| Composé de fichier binaire | .cfb | Oui | Oui |
Source ouverte et licence
Aspose.Email FOSS for .NET is released under the MIT license. The full source code is available on GitHub at par mail-foss/Aspose.email-FOSS pour-.net.Les demandes, les questions et les demandas sont bienvenues.
Pour commencer
- Guide de développeur - Documents détaillés et parcours de marche
- Base de connaissances FAQs et comment faire des articles
- Le référencement API - Classes et méthodes de référence complètes