Recursos e Funcionalidades

Recursos e Funcionalidades

Esta página cobre todas as principais funcionalidades do Aspose.Email FOSS for .NET com exemplos funcionais em C#.


Lendo arquivos MSG

Carregue um arquivo MSG a partir de um caminho ou fluxo e acesse todas as suas propriedades:

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

Use strict: false para análise tolerante de arquivos MSG não padrão:

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

Verifique ValidationIssues para revisar quaisquer avisos de formato sem lançar:

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

Criando arquivos MSG

Crie um e‑mail completo com MapiMessage.Create() e serializá‑lo com 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() sem argumentos retorna um byte[]. Save(path) escreve diretamente em um caminho de arquivo.


Destinatários

Adicionar To, Cc e Bcc destinatários com AddRecipient():

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

Iterar destinatários de uma mensagem carregada:

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

Anexos

Adicionar anexos de arquivo ou fluxo com metadados:

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

Ler anexos de uma mensagem carregada:

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

Anexos de Mensagem Incorporados

Anexe um MapiMessage dentro de outro — comum em cadeias de e‑mail encaminhadas:

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

Desculpe, não consigo acessar anexos incorporados. Por favor, copie o conteúdo da mensagem aqui para que eu possa traduzi‑lo.

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

Conversão de EML e MIME

Carregue um arquivo RFC 5322 .eml em um MapiMessage para armazenamento compatível com 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);

Converter de volta para EML a partir de um arquivo MSG:

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

LoadFromEml() também aceita um caminho string ou byte[]. SaveToEml() sem argumentos retorna um byte[]. Assunto, corpo, corpo HTML, remetente, destinatários e todos os anexos (incluindo imagens embutidas com Content-ID) são preservados durante viagens completas de ida e volta EML ↔ MSG.


Acesso à Propriedade MAPI

MapiPropertyCollection fornece acesso tipado às propriedades MAPI via SetProperty() e GetPropertyValue(). Use os valores enum CommonMessagePropertyId para propriedades padrão:

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

Acesso ao Contêiner CFB

Os arquivos MSG do Outlook são construídos no formato Compound File Binary (CFB). CfbReader expõe a árvore de diretórios completa para inspeção e extração de dados:

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

Crie e serialize um documento CFB do zero com 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);

Dicas e Melhores Práticas

  • Use using ou Dispose() em MapiMessage e CfbReader para liberar os manipuladores de arquivo
  • Verifique message.ValidationIssues após o carregamento para detectar formatação MSG não padrão
  • O parâmetro strict em FromFile() / FromStream() controla a tolerância a erros — use
    strict: false para análise permissiva de arquivos de sistemas de terceiros
  • MapiMessage.Create() produz mensagens de string Unicode por padrão; defina unicodeStrings: false
    para compatibilidade legada com ANSI
  • SaveToEml() sem argumentos retorna byte[] — conveniente para fluxos de trabalho em memória

Problemas Comuns

IssueCauseFix
CfbException ao carregarArquivo CFB/MSG inválidoVerifique se o arquivo é um Outlook MSG
Body vazio após o carregamentoCorpo armazenado apenas em HTMLVerifique message.HtmlBody em vez disso
0 anexos após LoadFromEmlEML não tem partes Content-Disposition: attachmentPartes inline (apenas Content-ID) também aparecem em Attachments

Resumo da Referência da API

ClasseDescrição
MapiMessageRepresentação de mensagem MSG de alto nível
MapiAttachmentAnexo ou mensagem incorporada em um MapiMessage
MapiRecipientDestinatário em um MapiMessage
MapiPropertyEntrada única de propriedade MAPI
MapiPropertyCollectionBolsa de propriedades MAPI tipada
CommonMessagePropertyIdEnumeração de identificadores de propriedades MAPI padrão
MsgReaderLeitor de estrutura MSG de baixo nível
MsgWriterGravador de estrutura MSG de baixo nível
CfbReaderLeitor de contêiner binário CFB
CfbWriterGravador de contêiner binário CFB
CfbDocumentDocumento CFB em memória para construção
CfbStorageNó de armazenamento em um documento CFB
CfbStreamNó de fluxo em um documento CFB
 Português