Работа с MAPI-свойствами

Установка и доступ к MAPI-свойствам Outlook

Aspose.Email для Java предоставляет класс MapiProperty, который представляет MAPI-свойство:

  • Имя: имя свойства.
  • Тег: тег свойства.
  • Данные: данные свойства.

В этой теме также обсуждается, как установить и получить доступ к MAPI-свойствам файла сообщения Outlook (MSG) с использованием Aspose.Email для Java. Кроме того, предоставлен пример кода о том, как удалить свойства из MSG и вложений.

Чтение свойств

Чтобы прочитать данные MAPI-свойств из MSG-файла:

  1. Создайте экземпляр класса MapiMessage, чтобы загрузить MSG-файл, используя статический метод Load().
  2. Установите ссылку на объект MapiMessage метода getProperties() для получения MapiPropertyCollection.
  3. Получите объект MapiProperty из MapiPropertyCollection по ключам MapiPropertyTag.
  4. Получите данные свойства с использованием соответствующего метода getXXX().  
    // For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
    //Instantiate an MSG file to load an MSG file from disk
    MapiMessage outlookMessageFile = MapiMessage.fromFile(dataDir + "messageMapi.msg");
    //Get the MapiProperties collection
    MapiPropertyCollection coll = outlookMessageFile.getProperties();
    //Access the MapiPropertyTag.PR_SUBJECT property
    MapiProperty prop = (MapiProperty) coll.get_Item((Object) MapiPropertyTag.PR_SUBJECT);
    //If the MapiProperty is not found, check the MapiProperty.PR_SUBJECT_W
    //which is a unicode peer of MapiPropertyTag.PR_SUBJECT
    if (prop == null) {
    prop = (MapiProperty) coll.get_Item(MapiPropertyTag.PR_SUBJECT_W);
    }
    //If it cannot be found
    if (prop == null) {
    System.out.println("Mapi property could not be found.");
    } else {
    //Get the property data as string
    String strSubject = prop.getString();
    System.out.println("Subject: " + strSubject);
    }
    //Read internet code page property
    prop = (MapiProperty) coll.get_Item(MapiPropertyTag.PR_INTERNET_CPID);
    if (prop != null) {
    System.out.println("Code page: " + prop.getLong());
    }

Установка дополнительных свойств

Следующий пример кода можно использовать для установки дополнительных свойств сообщения Outlook MapiMessage.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// PT_MV_FLOAT, PT_MV_R4, mv.float
MapiMessage msg = new MapiMessage();
IList values = (IList) new ArrayList();
values.addItem((float) 1);
values.addItem((float) 2);
msg.setProperty(new MapiProperty(0x23901004, values));
//PT_MV_DOUBLE, PT_MV_R8
values = (IList) new ArrayList();
values.addItem((double) 1);
values.addItem((double) 2);
msg.setProperty(new MapiProperty(0x23901005, values));
//PT_MV_APPTIME
values = (IList) new ArrayList();
values.addItem(30456.34);
values.addItem(40655.45);
msg.setProperty(new MapiProperty(0x23901007, values));
//PT_MV_I8, PT_MV_LONGLONG
values = (IList) new ArrayList();
values.addItem((long) 30456);
values.addItem((long) 40655);
msg.setProperty(new MapiProperty(0x23901014, values));
//PT_MV_SHORT, PT_MV_I2, mv.i2
values = (IList) new ArrayList();
values.addItem((short) 1);
values.addItem((short) 2);
msg.setProperty(new MapiProperty(0x23901002, values));
//PT_MV_BOOLEAN
values = (IList) new ArrayList();
values.addItem(true);
values.addItem(false);
msg.setProperty(new MapiProperty(0x2390100b, values));
//PT_NULL
msg.setProperty(new MapiProperty(0x67400001, new byte[1]));
//PT_MV_LONG
values = (IList) new ArrayList();
values.addItem((int) 4);
UUID uuid = UUID.randomUUID();
MapiProperty property = new MapiProperty(msg.getNamedPropertyMapping().getNextAvailablePropertyId(MapiPropertyType.PT_MV_LONG), values);
msg.getNamedPropertyMapping().addNamedPropertyMapping(property, 0x00008028, uuid);
msg.setProperty(property);
//OR you can set the custom property (with the custom name)
MapiMessage message = new MapiMessage("sender@test.com", "recipient@test.com", "subj", "Body of test msg");
values = (IList) new ArrayList();
values.addItem((int) 4);
property = new MapiProperty(message.getNamedPropertyMapping().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 = 123.456F;
MapiMessage newMsg = new MapiMessage();
long floatTag = newMsg.getNamedPropertyMapping().getNextAvailablePropertyId(MapiPropertyType.PT_FLOAT);
UUID guid = UUID.randomUUID();
MapiProperty newMapiProperty = new MapiProperty(floatTag, BitConverter.getBytesSingle(floatValue));
newMsg.getNamedPropertyMapping().addNamedPropertyMapping(newMapiProperty,(long) 12, guid);
newMsg.setProperty(newMapiProperty);
boolean propertyIsOk = false;
for (MapiNamedProperty prop : (Iterable<MapiNamedProperty>) newMsg.getNamedProperties().getValues())
{
if (prop.getGuid().equals(guid))
{
float val = prop.getFloat();
propertyIsOk = val == floatValue;
}
}

Удаление свойств

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
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.getAttachments().add(dataDir + "Outlook2 Test subject.msg", attachment);
System.out.println("Before removal = " + mapi.getAttachments().get_Item(mapi.getAttachments().size() - 1).getProperties().size());
mapi.getAttachments().get_Item(mapi.getAttachments().size() - 1).removeProperty(923467779);//Delete anyone property
System.out.println("After removal = " + mapi.getAttachments().get_Item(mapi.getAttachments().size() - 1).getProperties().size());
mapi.save(dataDir + "EMAIL_589265.msg");
MapiMessage mapi2 = MapiMessage.fromFile(dataDir + "EMAIL_589265.msg");
System.out.println("Reloaded = " + mapi2.getAttachments().get_Item(mapi2.getAttachments().size() - 1).getProperties().size());

Чтение именованных Mapi-свойств из сообщений электронной почты

Microsoft Outlook поддерживает добавление именованных MAPI-свойств в MSG-файл. Эти свойства добавляются пользователем. Разработчики могут добавить именованное свойство, например, “MyProp”, в MSG-файл с использованием Aspose.Email.

В этой статье иллюстрируется Aspose.Email MapiMessage коллекция getNamedProperties() для чтения именованных MAPI-свойств из MSG-файла.

Чтение именованного MAPI-свойства

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Load MSG file
MapiMessage message = MapiMessage.fromFile(dataDir + "message.msg");
// Get all named MAPI properties
MapiPropertyCollection properties = message.getNamedProperties();
// Read all properties in for loop
for (MapiNamedProperty mapiNamedProp : (Iterable<MapiNamedProperty>) properties.getValues()) {
// Read any specific property
switch (mapiNamedProp.getNameId()) {
case "TEST":
System.out.println(mapiNamedProp.getNameId() + " equals " + mapiNamedProp.getString());
break;
case "MYPROP":
System.out.println(mapiNamedProp.getNameId() + " equals " + mapiNamedProp.getString());
break;
default:
break;
}
}

Чтение именованного Mapi-свойства из вложения

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MailMessage mail = MailMessage.load(dataDir + "test.eml");
MapiMessage mapi = MapiMessage.fromMailMessage(mail);
for (MapiNamedProperty namedProperty : (Iterable<MapiNamedProperty>) mapi.getAttachments().get_Item(0).getNamedProperties().getValues()) {
if (namedProperty.getNameId().equalsIgnoreCase("CustomAttGuid")) {
System.out.println("Equal..");
}
}