کار با ویژگی‌های MAPI

دسترسی و تنظیم ویژگی MAPI در Outlook

این MapiProperty کلاس نمایانگر یک ویژگی MAPI است که شامل:

  • Name: رشته‌ای که ویژگی نام را نشان می‌دهد.
  • Tag: مقداری از نوع long که ویژگی برچسب را نشان می‌دهد.
  • Data: آرایه بایتی که ویژگی داده را نشان می‌دهد.

دریافت ویژگی‌های MAPI با استفاده از برچسب‌های ویژگی

برای دریافت ویژگی‌های MAPI:

  1. یک نمونه از MapiMessage توسط بارگذاری از فایل‌ها یا جریان.
  2. دریافت MapiProperty از MapiMessage.Properties توسط MapiPropertyTag کلیدها.

قطعه کد زیر نشان می‌دهد چگونه ویژگی MAPI را با استفاده از برچسب ویژگی 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());
}

تنظیم ویژگی‌های MAPI

قطعه کد زیر نشان می‌دهد چگونه ویژگی‌های 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");

که تعریف متد ConvertDateTime به صورت زیر است:

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

ویژگی‌های افزوده

قطعه کد زیر نشان می‌دهد چگونه ویژگی‌های اضافی MAPI را تنظیم کنید.

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

خواندن ویژگی‌های MAPI نام‌گذاری شده از فایل‌های MSG

قطعه کد زیر نشان می‌دهد چگونه ویژگی‌های نام‌گذاری شده MAPI را از فایل 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;
    }
}

خواندن ویژگی‌های MAPI نام‌گذاری شده از پیوست‌ها

Aspose.Email همچنین به شما امکان می‌دهد از طریق ویژگی‌های یک MapiAttachment و جستجوی یک ویژگی نام‌دار، به طریقی مشابه مثال بالا، برای MapiMessage. قطعه کد زیر نشان می‌دهد چگونه یک ویژگی نام‌دار را از طریق مجموعه ویژگی‌های پیوست جستجو کنید.

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

حذف ویژگی‌ها از MSGها و پیوست‌ها

قطعه کد زیر نشان می‌دهد چگونه ویژگی‌ها را از MSGها و پیوست‌ها حذف کنید.

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