Introdução
Analisar mensagens de e-mail programaticamente é um requisito comum para ferramentas de arquivamento, pipelines de conformidade e utilitários de migração. Os arquivos Outlook MSG usam o formato do contêiner Compound File Binary (CFB) com fluxos de propriedades MAPI, enquanto os arquisitos EML seguem o padrão MIME. Ambos os formatos exigem tratamento cuidadoso de codificações, cabeçalhos dobrados e anexos aninhados.
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 - Não.
Este post percorre os recursos de análise de mensagens incluídos na biblioteca, desde o carregamento de arquivos fora do disco até a extração de propriedades individuais MAPI e conversão entre formatos.
O que está incluído
Carregamento de arquivos MSG
A Comissão MapiMessage class é o ponto de entrada principal para trabalhar com arquivos Outlook MSG. Você pode carregar uma mensagem a partir de um caminho de arquivo ou um fluxo, com uma bandeira opcional de validação rigorosa que surge quaisquer problemas estruturais encontrados no archivo.
// 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}");
Os que voltaram . MapiMessage expõe as propriedades tipizadas para campos comuns, incluindo: Subject, Body, HtmlBody, SenderName, SenderEmailAddress, InternetMessageId, e MessageDeliveryTime.
Carregamento de mensagens EML
Os arquivos EML usam o formato MIME. MapiMessage.LoadFromEml Aceita um caminho de arquivo, a Stream, ou a byte[] e retorna o mesmo MapiMessage Objeto, então você usa uma API unificada independentemente do formato de origem.
// 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()}");
O analisador lida com cabeçalhos dobrados, codificações de transferência Base64 e impressíveis por citação e campos To/Cc multi-receptores.
Trabalhar com destinatários e anexos
Uma vez que uma mensagem é carregada, os destinatários e anexos estão disponíveis como coleções fortemente digitadas. MapiRecipient carregado EmailAddress, DisplayName, e RecipientType Cada campo. MapiAttachment fornece: Filename, Data, MimeType, e 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);
}
Os anexos de mensagens incorporadas também são suportados. MapiAttachment.IsEmbeddedMessage é: true, o EmbeddedMessage propriedade retorna um aninhado MapiMessage que pode inspecionar recursivamente.
Acesso às propriedades MAPI
Para cenários avançados, cada mensagem, destinatário e anexo expõe um Properties Coleção de tipo MapiPropertyCollection. Você pode ler, adicionar e remover propriedades MAPI individuais por seu ID de proprietade e código do tipo.
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);
A Comissão CommonMessagePropertyId enum define identificadores de propriedade MAPI bem conhecidos para a semântica da mensagem central, campos do corpo, cabeçalhos de transporte e metadados de anexo.
Conversão entre MSG e EML
Uma mensagem analisada pode ser salva de volta em qualquer formato. Save() escreve bytes MSG, enquanto SaveToEml() Isso torna a conversão de formato simples.
// 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");
Ambos os métodos também aceitam uma Stream Parâmetro para o processamento em memória sem tocar no sistema de ficheiros.
Começo rápido
Instalar o pacote a partir do NuGet:
dotnet add package Aspose.Email.FOSSEntão analisa a tua primeira mensagem:
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.");
Formatos suportados
| Formatos de imagem | Extensão | Leia. | Escrever . |
|---|---|---|---|
| Outlook MSG (em inglês) | .msg | - Sim , sim . | - Sim , sim . |
| MIME (EML) | .eml | - Sim , sim . | - Sim , sim . |
| Arquivo binário composto | .cfb | - Sim , sim . | - Sim , sim . |
Open Source & Licenciamento
Aspose.Email FOSS for .NET is released under the MIT license. The full source code is available on GitHub at Associação de Empregadores da Internet (AEM).Contribuições, questões e pedidos de retirada são bem-vindos.
Começar a Fazer
- Guia de Desenvolvedores documentação pormenorizada e orientações
- Base de conhecimento FAQs e artigos de orientação
- Referência API referência completa da classe e do método