Lavorare con le proprietà MAPI

Accesso e impostazione della proprietà Outlook MAPI

Il MapiProperty la classe rappresenta una proprietà MAPI, che contiene:

  • Nome: una stringa che rappresenta la proprietà nome.
  • Tag: un valore di tipo long che rappresenta la proprietà tag.
  • Dati: un array di byte che rappresenta la proprietà dati.

Ottieni proprietà MAPI usando i tag di proprietà

Per ottenere le proprietà MAPI:

  1. Crea un’istanza di MapiMessage da caricamento da file o stream.
  2. Ottieni il MapiProperty da MapiMessage.Properties da MapiPropertyTag chiavi.

Il frammento di codice seguente mostra come ottenere la proprietà MAPI usando il tag della proprietà 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());
}

Imposta le proprietà MAPI

Il seguente frammento di codice mostra come impostare le proprietà 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");

dove la definizione del metodo ConvertDateTime è la seguente:

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

Proprietà aggiuntive

Il seguente frammento di codice mostra come impostare proprietà MAPI aggiuntive.

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

Leggere proprietà MAPI nominate dai file MSG

Il seguente frammento di codice mostra come leggere proprietà MAPI nominate dal file 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;
    }
}

Leggere proprietà MAPI nominate dagli allegati

Aspose.Email consente inoltre di attraversare le proprietà di un MapiAttachment e cercare una proprietà nominata, in modo simile all’esempio sopra, per MapiMessage. Il seguente frammento di codice mostra come cercare una proprietà nominata attraverso la raccolta delle proprietà degli allegati.

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

Rimuovere le proprietà da MSG e allegati

Il seguente frammento di codice mostra come rimuovere proprietà da MSG e allegati.

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