Работа с MAPI-свойствами
Доступ и установка свойств MAPI Outlook
Класс MapiProperty представляет собой свойство MAPI, которое содержит:
- Имя: строка, представляющая имя свойства.
- Тег: значение типа long, представляющее тег свойства.
- Данные: массив байтов, представляющий данные свойства.
Получение свойства MAPI с использованием тега свойства MAPI
Чтобы получить свойства MAPI:
- Создайте экземпляр MapiMessage с загрузкой из файлов или потока.
- Получите MapiProperty из MapiMessage.Properties по ключам MapiPropertyTag.
Следующий фрагмент кода показывает, как получить свойство MAPI с использованием тега свойства MAPI.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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]; | |
} | |
// Cannot 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.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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 выглядит следующим образом:
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
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.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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 Outlook
Microsoft Outlook поддерживает добавление именованных свойств MAPI в файл MSG. Эти именованные свойства MAPI добавляются пользователем. Вы можете добавить именованное свойство, например, “MyProp”, в файл MSG с помощью Aspose.Email. Эта статья иллюстрирует возможности Aspose.Email:
Читать именованные свойства MAPI из файла MSG
Следующий фрагмент кода показывает, как читать именованные свойства MAPI из файла MSG.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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. Следующий фрагмент кода показывает, как искать именованное свойство через коллекцию свойств вложения.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// The path to the File directory. | |
string dataDir = RunExamples.GetDataDir_Outlook(); | |
// 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 и вложений.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// The path to the File directory. | |
string dataDir = RunExamples.GetDataDir_Outlook(); | |
MapiMessage mapi = new MapiMessage("from@doamin.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 anyone 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); |