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:
| Property | Description |
|---|---|
Subject | Message subject |
Body | Plain text body |
BodyHtml | HTML body |
SenderName | Sender display name |
SenderEmailAddress | Sender email address |
DisplayTo | To recipients display string |
DisplayCc | Cc recipients display string |
DisplayBcc | Bcc recipients display string |
InternetMessageId | RFC 5322 Message-ID |
MessageDeliveryTime | Delivery timestamp |
TransportMessageHeaders | Raw RFC 5322 headers |
AttachFilename | Short attachment filename |
AttachLongFilename | Long attachment filename |
AttachMimeTag | Attachment MIME type |
AttachContentId | Attachment Content-ID |
Property Type Codes
The PropertyTypeCode enum maps MAPI type codes:
| Type | Description |
|---|---|
PtypString | Unicode string |
PtypString8 | ANSI string |
PtypInteger32 | 32-bit integer |
PtypInteger64 | 64-bit integer |
PtypBoolean | Boolean |
PtypTime | DateTime (FILETIME) |
PtypBinary | Byte array |
PtypGuid | GUID |
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
- Reading MSG Files — Load and inspect MSG files
- EML Conversion — Convert between formats
- CFB Containers — Low-level binary container access