Características y Funcionalidades

Características y Funcionalidades

Características y funcionalidades

Esta página cubre cada característica principal de Aspose.Email FOSS for .NET con ejemplos funcionales en C#.


Lectura de archivos MSG

Cargue un archivo MSG desde una ruta o flujo y acceda a todas sus propiedades:

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

Utilice strict: false para el análisis indulgente de archivos MSG no estándar:

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

Verifique ValidationIssues para revisar cualquier advertencia de formato sin lanzar:

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

Creando archivos MSG

Construya un correo electrónico completo con MapiMessage.Create() y serialícelo 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() sin argumentos devuelve un byte[]. Save(path) escribe directamente a una ruta de archivo.


Destinatarios

Agregar To, Cc y Bcc destinatarios con AddRecipient():

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

Iterar destinatarios de un mensaje cargado:

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

Adjuntos

Agregar archivos o flujos adjuntos con metadatos:

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

Leer archivos adjuntos de un mensaje cargado:

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

Adjuntos de Mensaje Incorporado

Adjuntar uno MapiMessage dentro de otro — común en cadenas de correo reenviado:

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

Leer los archivos adjuntos del mensaje incrustado:

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

Conversión de EML y MIME

Cargue un archivo RFC 5322 .eml en un MapiMessage para almacenamiento compatible 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);

Convertir de nuevo a EML desde un archivo MSG:

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

LoadFromEml() también acepta una ruta string o byte[]. SaveToEml() sin argumentos devuelve un byte[]. El asunto, el cuerpo, el cuerpo HTML, el remitente, los destinatarios y todos los archivos adjuntos (incluidas las imágenes en línea con Content-ID) se conservan durante los viajes de ida y vuelta completos EML ↔ MSG.


Acceso a la Propiedad MAPI

MapiPropertyCollection proporciona acceso tipado a las propiedades MAPI a través de SetProperty() y GetPropertyValue(). Utilice los valores de enumeración CommonMessagePropertyId para propiedades estándar:

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

Acceso al contenedor CFB

Los archivos MSG de Outlook se basan en el formato Compound File Binary (CFB). CfbReader expone el árbol de directorios completo para inspección y extracción de datos:

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

Construir y serializar un documento CFB desde cero 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);

Consejos y mejores prácticas

  • Utilice using o Dispose() en MapiMessage y CfbReader para liberar los manejadores de archivo
  • Verifique message.ValidationIssues después de cargar para detectar un formato MSG no estándar
  • El parámetro strict en FromFile() / FromStream() controla la tolerancia a errores — utilice strict: false para un análisis indulgente de archivos de sistemas de terceros
  • MapiMessage.Create() genera mensajes de cadena Unicode por defecto; establezca unicodeStrings: false para compatibilidad con ANSI heredado
  • SaveToEml() sin argumentos devuelve byte[] — conveniente para flujos de trabajo en memoria

Problemas comunes

IssueCauseFix
CfbException al cargarNo es un archivo CFB/MSG válidoVerifique que el archivo sea un Outlook MSG
Body vacío después de cargarCuerpo almacenado solo en HTMLCompruebe message.HtmlBody en su lugar
No se encontró la constante de tipo de destinatarioNo es un tipo independienteUtilice MapiMessage.RecipientTypeTo, MapiMessage.RecipientTypeCc o MapiMessage.RecipientTypeBcc
0 archivos adjuntos después de LoadFromEmlEML no tiene partes Content-Disposition: attachmentLas partes en línea (solo Content-ID) también aparecen en Attachments

Resumen de la referencia de API

ClaseDescripción
MapiMessageRepresentación de mensaje MSG de alto nivel
MapiAttachmentAdjunto o mensaje incrustado en un MapiMessage
MapiRecipientDestinatario en un MapiMessage
MapiPropertyEntrada única de propiedad MAPI
MapiPropertyCollectionBolsa de propiedades MAPI tipada
CommonMessagePropertyIdEnumeración de identificadores de propiedades MAPI estándar
MsgReaderLector de estructura MSG de bajo nivel
MsgWriterEscritor de estructura MSG de bajo nivel
CfbReaderLector de contenedor binario CFB
CfbWriterEscritor de contenedor binario CFB
CfbDocumentDocumento CFB en memoria para construcción
CfbStorageNodo de almacenamiento en un documento CFB
CfbStreamNodo de flujo en un documento CFB
 Español