Funcționalități și caracteristici

Funcționalități și caracteristici

Caracteristici și funcționalități

Această pagină acoperă fiecare caracteristică majoră a Aspose.Email FOSS for .NET cu exemple C# funcționale.


Citirea fișierelor MSG

Încărcați un fișier MSG dintr-o cale sau flux și accesați toate proprietățile sale:

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

Utilizați strict: false pentru analiză indulgentă a fișierelor MSG non-standard:

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

Verificați ValidationIssues pentru a revizui eventualele avertismente de format fără a arunca:

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

Crearea fișierelor MSG

Construiți un e‑mail complet cu MapiMessage.Create() și serializați cu 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() fără argumente returnează un byte[]. Save(path) scrie direct la o cale de fișier.


Destinatari

Adăugați To, Cc și Bcc destinatari cu AddRecipient():

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

Iterați destinatarii dintr-un mesaj încărcat:

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

Atașamente

Adăugați atașamente de fișiere sau fluxuri cu metadate:

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

Citește atașamentele dintr-un mesaj încărcat:

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

Atașamente de Mesaje Încapsulate

Atașați unul MapiMessage în altul — comun în lanțurile de e‑mail redirecționate:

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

Citește atașamentele mesajului încorporat:

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

Conversie EML și MIME

Încărcați un fișier RFC 5322 .eml într-un MapiMessage pentru stocare compatibilă cu 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);

Convertiți înapoi la EML dintr-un fișier MSG:

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

LoadFromEml() acceptă, de asemenea, o cale string sau byte[]. SaveToEml() fără argumente returnează un byte[]. Subiect, corp, corp HTML, expeditor, destinatari și toate atașamentele (inclusiv imaginile inline cu Content-ID) sunt păstrate pe parcursul complet al conversiilor EML ↔ MSG.


Acces la proprietăți MAPI

MapiPropertyCollection oferă acces tipizat la proprietățile MAPI prin intermediul SetProperty() și GetPropertyValue(). Utilizați valorile enum CommonMessagePropertyId pentru proprietățile 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}");

Acces Container CFB

Fișierele Outlook MSG sunt construite pe formatul Compound File Binary (CFB). CfbReader expune arborele complet al directorului pentru inspecție și extragerea datelor:

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

Construiește și serializează un document CFB de la zero cu 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);

Sfaturi și cele mai bune practici

  • Utilizați using sau Dispose() pe MapiMessage și CfbReader pentru a elibera handle‑urile de fișier
  • Verificați message.ValidationIssues după încărcare pentru a detecta formatul MSG non‑standard
  • Parametrul strict în FromFile() / FromStream() controlează toleranța la erori — utilizați
    strict: false pentru parsare indulgentă a fișierelor din sisteme terțe
  • MapiMessage.Create() generează mesaje ca șiruri Unicode în mod implicit; setați unicodeStrings: false
    pentru compatibilitate legacy ANSI
  • SaveToEml() fără argumente returnează byte[] — convenabil pentru fluxuri de lucru în memorie

Probleme comune

ProblemCauzăRemediere
CfbException la încărcareFișier CFB/MSG nevalidVerificați că fișierul este un Outlook MSG
Body gol după încărcareCorpul este stocat doar în HTMLVerificați message.HtmlBody în schimb
Constanta tipului de destinatar nu a fost găsităNu este un tip independentUtilizați MapiMessage.RecipientTypeTo, MapiMessage.RecipientTypeCc sau MapiMessage.RecipientTypeBcc
0 atașamente după LoadFromEmlEML nu are părți Content-Disposition: attachmentPărțile inline (numai Content-ID) apar și în Attachments

Sumar referință API

ClasăDescriere
MapiMessageReprezentare de mesaj MSG la nivel înalt
MapiAttachmentAtașament sau mesaj încorporat pe un MapiMessage
MapiRecipientDestinatar pe un MapiMessage
MapiPropertyIntrare unică de proprietate MAPI
MapiPropertyCollectionPungă de proprietăți MAPI tipizată
CommonMessagePropertyIdEnumerare a identificatorilor standard de proprietăți MAPI
MsgReaderCititor de structură MSG la nivel scăzut
MsgWriterScriitor de structură MSG la nivel scăzut
CfbReaderCititor de container binar CFB
CfbWriterScriitor de container binar CFB
CfbDocumentDocument CFB în memorie pentru construcție
CfbStorageNod de stocare într-un document CFB
CfbStreamNod de flux într-un document CFB
 Română