Travailler avec les propriétés MAPI

Accès et définition d’une propriété Outlook MAPI

Le MapiProperty classe représente une propriété MAPI, qui contient :

  • Name: une chaîne qui représente la propriété de nom.
  • Tag: une valeur de type long qui représente la propriété de balise.
  • Data: un tableau d’octets qui représente la propriété de données.

Obtenir les propriétés MAPI à l’aide des étiquettes de propriété

Pour obtenir les propriétés MAPI :

  1. Créez une instance de MapiMessage par chargement depuis des fichiers ou un flux.
  2. Obtenir le MapiProperty de MapiMessage.Properties par MapiPropertyTag clés.

Le code suivant montre comment obtenir une propriété MAPI en utilisant le tag de propriété MAPI.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
            
 // Load from file
MapiMessage msg = MapiMessage.FromFile(dataDir + @"message.msg");

string subject;

// Access the MapiPropertyTag.PR_SUBJECT property
MapiProperty prop = msg.Properties[MapiPropertyTag.PR_SUBJECT];

// If the property is not found, check the MapiPropertyTag.PR_SUBJECT_W (which is a Unicode peer of the MapiPropertyTag.PR_SUBJECT)
if (prop == null)
{
    prop = msg.Properties[MapiPropertyTag.PR_SUBJECT_W];
}

// Still not found
if (prop == null)
{
    Console.WriteLine("No property found!");
    return;
}

// Get the property data as string
subject = prop.GetString();

Console.WriteLine("Subject:" + subject);
// Read internet code page property
prop = msg.Properties[MapiPropertyTag.PR_INTERNET_CPID];
if (prop != null)
{
    Console.WriteLine("CodePage:" + prop.GetLong());
}

Définir les propriétés MAPI

L’extrait de code suivant vous montre comment définir des propriétés MAPI.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Create a sample Message
MapiMessage mapiMsg = new MapiMessage("user1@gmail.com", "user2@gmail.com", "This is subject", "This is body");

// Set multiple properties
mapiMsg.SetProperty(new MapiProperty(MapiPropertyTag.PR_SENDER_ADDRTYPE_W, Encoding.Unicode.GetBytes("EX")));
MapiRecipient recipientTo = mapiMsg.Recipients[0];
MapiProperty propAddressType = new MapiProperty(MapiPropertyTag.PR_RECEIVED_BY_ADDRTYPE_W, Encoding.UTF8.GetBytes("MYFAX"));
recipientTo.SetProperty(propAddressType);
string faxAddress = "My Fax User@/FN=fax#/VN=voice#/CO=My Company/CI=Local";
MapiProperty propEmailAddress = new MapiProperty(MapiPropertyTag.PR_RECEIVED_BY_EMAIL_ADDRESS_W, Encoding.UTF8.GetBytes(faxAddress));
recipientTo.SetProperty(propEmailAddress);
mapiMsg.SetMessageFlags(MapiMessageFlags.MSGFLAG_UNSENT | MapiMessageFlags.MSGFLAG_FROMME);
mapiMsg.SetProperty(new MapiProperty(MapiPropertyTag.PR_RTF_IN_SYNC, BitConverter.GetBytes((long)1)));

// Set DateTime property
MapiProperty modificationTime = new MapiProperty(MapiPropertyTag.PR_LAST_MODIFICATION_TIME, ConvertDateTime(new DateTime(2013, 9, 11)));
mapiMsg.SetProperty(modificationTime);
mapiMsg.Save(dataDir + "MapiProp_out.msg");

où la définition de la méthode ConvertDateTime est la suivante :

private static byte[] ConvertDateTime(DateTime t)
{
    long filetime = t.ToFileTime();
    byte[] d = new byte[8];
    d[0] = (byte)(filetime & 0xFF);
    d[1] = (byte)((filetime & 0xFF00) >> 8);
    d[2] = (byte)((filetime & 0xFF0000) >> 16);
    d[3] = (byte)((filetime & 0xFF000000) >> 24);
    d[4] = (byte)((filetime & 0xFF00000000) >> 32);
    d[5] = (byte)((filetime & 0xFF0000000000) >> 40);
    d[6] = (byte)((filetime & 0xFF000000000000) >> 48);
    d[7] = (byte)(((ulong)filetime & 0xFF00000000000000) >> 56);
    return d;
}

Propriétés supplémentaires

Le fragment de code suivant vous montre comment définir des propriétés MAPI supplémentaires.

MapiMessage msg = new MapiMessage("sender@test.com", "recipient@test.com", "subj", "Body of test msg");

// PT_MV_FLOAT, PT_MV_R4, mv.float
IList<object> values = new List<object>();
values.Add((float)1);
values.Add((float)2);
msg.SetProperty(new MapiProperty(0x23901004, values));

// PT_MV_DOUBLE, PT_MV_R8
values = new List<object>();
values.Add((double)1);
values.Add((double)2);
msg.SetProperty(new MapiProperty(0x23901005, values));

// PT_MV_CURRENCY, mv.fixed.14.4
values = new List<object>();
values.Add((decimal)123.34);
values.Add((decimal)289.45);
msg.SetProperty(new MapiProperty(0x23901006, values));

// PT_MV_APPTIME
values = new List<object>();
values.Add(30456.34);
values.Add(40655.45);
msg.SetProperty(new MapiProperty(0x23901007, values));

// PT_MV_I8, PT_MV_LONGLONG
values = new List<object>();
values.Add((long)30456);
values.Add((long)40655);
msg.SetProperty(new MapiProperty(0x23901014, values));

// PT_MV_CLSID, mv.uuid
values = new List<object>();
values.Add(Guid.NewGuid());
values.Add(Guid.NewGuid());
msg.SetProperty(new MapiProperty(0x23901048, values));

// PT_MV_SHORT, PT_MV_I2, mv.i2
values = new List<object>();
values.Add((short)1);
values.Add((short)2);
msg.SetProperty(new MapiProperty(0x23901002, values));

// PT_MV_SYSTIME
values = new List<object>();
values.Add(DateTime.Now);
values.Add(DateTime.Now);
msg.SetProperty(new MapiProperty(0x23901040, values));

// PT_MV_BOOLEAN
values = new List<object>();
values.Add(true);
values.Add(false);
msg.SetProperty(new MapiProperty(0x2390100b, values));

// PT_MV_BINARY
values = new List<object>();
values.Add(Guid.NewGuid().ToByteArray());
values.Add(new byte[]{1,2,4,5,6,7,5,4,3,5,6,7,8,6,4,3,4,5,6,7,8,6,5,4,3,7,8,9,0,2,3,4,});
msg.SetProperty(new MapiProperty(0x23901102, values));

// PT_NULL
msg.SetProperty(new MapiProperty(0x67400001, new byte[1]));
MapiMessage message = new MapiMessage("sender@test.com", "recipient@test.com", "subj", "Body of test msg");

// PT_MV_LONG
values = new List<object>();
values.Add((int)4);
MapiProperty property = new MapiProperty(message.NamedPropertyMapping.GetNextAvailablePropertyId(MapiPropertyType.PT_MV_LONG), values);
message.NamedPropertyMapping.AddNamedPropertyMapping(property, 0x00008028, new Guid("00062004-0000-0000-C000-000000000046"));
message.SetProperty(property);

// OR you can set the custom property (with the custom name)
message = new MapiMessage("sender@test.com", "recipient@test.com", "subj", "Body of test msg");
values = new List<object>();
values.Add((int)4);
property = new MapiProperty(message.NamedPropertyMapping.GetNextAvailablePropertyId(MapiPropertyType.PT_MV_LONG), values);
message.AddCustomProperty(property, "customProperty");

//PT_FLOAT
//Please note that you need explicit cast to float value for this to work
float floatValue = (float)123.456;
MapiMessage newMsg = new MapiMessage();
long floatTag = newMsg.NamedPropertyMapping.GetNextAvailablePropertyId(MapiPropertyType.PT_FLOAT);
Guid guid = Guid.NewGuid();
MapiProperty newMapiProperty = new MapiProperty(floatTag, BitConverter.GetBytes(floatValue));
newMsg.NamedPropertyMapping.AddNamedPropertyMapping(newMapiProperty, 12, guid);
newMsg.SetProperty(newMapiProperty);

Lire les propriétés MAPI nommées des fichiers MSG

Le fragment de code suivant vous montre comment lire des propriétés MAPI nommées depuis le fichier MSG.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

// Load from file
MapiMessage message = MapiMessage.FromFile(dataDir + @"message.msg");

// Get all named MAPI properties
MapiPropertyCollection properties = message.NamedProperties;
// Read all properties in foreach loop
foreach (MapiNamedProperty mapiNamedProp in properties.Values)
{
    // Read any specific property
    switch (mapiNamedProp.NameId)
    {
        case "TEST":
            Console.WriteLine("{0} = {1}", mapiNamedProp.NameId, mapiNamedProp.GetString());
            break;
        case "MYPROP":
            Console.WriteLine("{0} = {1}", mapiNamedProp.NameId, mapiNamedProp.GetString());
            break;
        default: break;
    }
}

Lire les propriétés MAPI nommées des pièces jointes

Aspose.Email permet également de parcourir les propriétés d’un MapiAttachment et rechercher une propriété nommée, d’une manière similaire à l’exemple ci‑dessus, pour MapiMessage. Le fragment de code suivant vous montre comment rechercher une propriété nommée à travers la collection de propriétés des pièces jointes.

private static string GetCustomAttachmentGuid(string dataDir)
{
    // Load from file
    MailMessage mail = MailMessage.Load(dataDir + "outputAttachments.msg");

    var mapi = MapiMessage.FromMailMessage(mail);

    foreach (MapiNamedProperty namedProperty in mapi.Attachments[0].NamedProperties.Values)
    {
        if (string.Compare(namedProperty.NameId, "CustomAttGuid", StringComparison.OrdinalIgnoreCase) == 0)
        {
            return namedProperty.GetString();
        }
    }

    return string.Empty;
}

Suppression de propriétés des MSG et des pièces jointes

Le fragment de code suivant vous montre comment supprimer des propriétés des MSG et des pièces jointes.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

MapiMessage mapi = new MapiMessage("from@domain.com", "to@domain.com", "subject", "body");
mapi.SetBodyContent("<html><body><h1>This is the body content</h1></body></html>", BodyContentType.Html);
MapiMessage attachment = MapiMessage.FromFile(dataDir + @"message.msg");
mapi.Attachments.Add("Outlook2 Test subject.msg", attachment);
Console.WriteLine("Before removal = " + mapi.Attachments[mapi.Attachments.Count - 1].Properties.Count);

mapi.Attachments[mapi.Attachments.Count - 1].RemoveProperty(923467779);// Delete any one property
Console.WriteLine("After removal = " + mapi.Attachments[mapi.Attachments.Count - 1].Properties.Count);
mapi.Save(@"EMAIL_589265.msg");

MapiMessage mapi2 = MapiMessage.FromFile(@"EMAIL_589265.msg");
Console.WriteLine("Reloaded = " + mapi2.Attachments[mapi2.Attachments.Count - 1].Properties.Count);