MAPI Properties

MAPI Properties

Every MSG file stores data as MAPI properties — tagged key-value pairs identified by a property ID and type code. Aspose.Email FOSS for .NET gives direct access to these properties through MapiMessage, MapiPropertyCollection, and the CommonMessagePropertyId enum.


Reading Properties

Convenience Properties

MapiMessage exposes the most common properties as typed C# properties:

using Aspose.Email.Foss.Msg;

using var message = MapiMessage.FromFile("sample.msg");

Console.WriteLine(message.Subject);              // string?
Console.WriteLine(message.Body);                 // string?
Console.WriteLine(message.HtmlBody);             // string?
Console.WriteLine(message.SenderName);           // string?
Console.WriteLine(message.SenderEmailAddress);   // string?
Console.WriteLine(message.InternetMessageId);    // string?
Console.WriteLine(message.MessageDeliveryTime);  // DateTime?
Console.WriteLine(message.MessageClass);         // string?

Raw Property Access

For properties not exposed as convenience fields, use GetPropertyValue:

// Read a string property by ID and type
var displayTo = message.GetPropertyValue(
    (ushort)CommonMessagePropertyId.DisplayTo,
    (ushort)PropertyTypeCode.PtypString,
    decode: true);

Console.WriteLine($"Display To: {displayTo}");

Iterate All Properties

// List all property keys (ID + type pairs)
foreach (var key in message.IterPropertyKeys())
    Console.WriteLine($"Property: 0x{key:X8}");

// Iterate full property objects
foreach (var prop in message.IterProperties())
{
    Console.WriteLine($"ID=0x{prop.PropertyId:X4} " +
                      $"Type=0x{prop.PropertyType:X4} " +
                      $"Tag=0x{prop.PropertyTag:X8} " +
                      $"Value={prop.Value}");
}

Writing Properties

Set Properties on a New Message

var message = MapiMessage.Create("Test", "Body");

message.SetProperty(
    (ushort)CommonMessagePropertyId.SenderName,
    (ushort)PropertyTypeCode.PtypString,
    "Alice");

message.SetProperty(
    (ushort)CommonMessagePropertyId.SenderEmailAddress,
    (ushort)PropertyTypeCode.PtypString,
    "alice@example.com");

message.SetProperty(
    (ushort)CommonMessagePropertyId.MessageDeliveryTime,
    (ushort)PropertyTypeCode.PtypTime,
    new DateTime(2026, 3, 15, 10, 30, 0, DateTimeKind.Utc));

Direct Collection Access

MapiPropertyCollection provides Add, Set, Get, and Remove:

// Access the property collection
var props = message.Properties;

// Add a property
props.Add(
    (ushort)CommonMessagePropertyId.InternetCodepage,
    (ushort)PropertyTypeCode.PtypInteger32,
    65001,  // UTF-8
    flags: 0);

// Read it back
var codepage = props.Get(
    (ushort)CommonMessagePropertyId.InternetCodepage,
    (ushort)PropertyTypeCode.PtypInteger32);

Console.WriteLine($"Codepage: {codepage?.Value}");

// Remove a property
props.Remove(
    (ushort)CommonMessagePropertyId.InternetCodepage,
    (ushort)PropertyTypeCode.PtypInteger32);

Common Property IDs

The CommonMessagePropertyId enum provides named constants for frequently used MAPI property IDs:

PropertyDescription
SubjectMessage subject
BodyPlain text body
BodyHtmlHTML body
SenderNameSender display name
SenderEmailAddressSender email address
DisplayToTo recipients display string
DisplayCcCc recipients display string
DisplayBccBcc recipients display string
InternetMessageIdRFC 5322 Message-ID
MessageDeliveryTimeDelivery timestamp
TransportMessageHeadersRaw RFC 5322 headers
AttachFilenameShort attachment filename
AttachLongFilenameLong attachment filename
AttachMimeTagAttachment MIME type
AttachContentIdAttachment Content-ID

Property Type Codes

The PropertyTypeCode enum maps MAPI type codes:

TypeDescription
PtypStringUnicode string
PtypString8ANSI string
PtypInteger3232-bit integer
PtypInteger6464-bit integer
PtypBooleanBoolean
PtypTimeDateTime (FILETIME)
PtypBinaryByte array
PtypGuidGUID

Attachment Properties

Each MapiAttachment also has its own Properties collection:

foreach (var attachment in message.Attachments)
{
    Console.WriteLine($"Attachment: {attachment.Filename}");

    foreach (var prop in attachment.Properties.IterProperties())
        Console.WriteLine($"  0x{prop.PropertyTag:X8} = {prop.Value}");
}

See Also