Работа с вложениями сообщений

Разбор и сохранение вложений

Файлы сообщений Outlook могут содержать одно или несколько вложений. Aspose.Email позволяет разработчикам проходить по вложениям в файле MSG и сохранять их на диск. Эта тема описывает процесс. Также описывается, как встроить вложение.

Класс Aspose.Email MapiMessage используется для загрузки файла MSG с диска и предоставляет метод getAttachments(), который ссылается на коллекцию объектов MapiAttachment, связанных с файлом MSG. Объект MapiAttachment дополнительно предоставляет методы, которые выполняют действия с вложением.

Чтобы сохранить вложения в файле MSG на диск с оригинальным именем и расширением:

  1. Создайте экземпляр класса MapiMessage, чтобы загрузить файл MSG, используя статический метод Load().
  2. Вызовите метод getAttachments() класса MapiRecipient, чтобы получить ссылку на коллекцию объектов MapiAttachment, связанных с файлом MSG.
  3. Пройдите в цикле по MapiAttachmentCollection, чтобы отобразить содержание каждого объекта MapiAttachment через его публичные методы.
  4. Вызовите метод save() класса MapiAttachment, чтобы сохранить вложение на диск.  
    // 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 + "WithEmbeddedMsg.msg");
    //Loop through the attachments collection associated with the MapiMessage object
    for (int i = 0; i < outlookMessageFile.getAttachments().size(); i++) {
    //Set a reference to the MapiAttachment object
    MapiAttachment outlookMessageAttachment = (MapiAttachment) outlookMessageFile.getAttachments().get_Item(i);
    //Display attachment type
    System.out.println("Att Type : " + outlookMessageAttachment.getMimeTag());
    //Display attached file name
    System.out.println("File Name : " + outlookMessageAttachment.getLongFileName());
    //Save attachment to the disk
    outlookMessageAttachment.save(dataDir + outlookMessageAttachment.getDisplayName());
    }

Встраивание сообщений как вложений

Сообщение Microsoft Outlook может содержать другие сообщения Microsoft Outlook во вложениях либо в виде обычных сообщений, описанных выше, либо встроенных сообщений. Коллекция MapiAttachmentCollection предоставляет перегруженные члены метода add для создания сообщений Outlook с обоими типами вложений. Вложенные в файл MSG сообщения содержат PR_ATTACH_METHOD со значением 5.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MapiMessage msg = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
MapiMessage attachMsg = MapiMessage.fromFile(dataDir + "message.msg");
msg.getAttachments().add("Weekly report", attachMsg);
msg.save(dataDir + "EmbededMessageAsAttachment.msg");

Чтение встроенного сообщения из вложения

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MapiMessage mapi = MapiMessage.fromFile(dataDir + "EmbededMessageAsAttachment.msg");
MapiMessage emb = mapi.getAttachments().get_Item(0).getObjectData().toMapiMessage();

Вставка и замена вложений MSG

API Aspose.Email предоставляет возможность вставлять вложения по определенному индексу в родительском сообщении. Он также предоставляет возможность замены содержимого вложения другим вложением.

Вставить вложение MSG в конкретное место

API Aspose.Email предоставляет возможность вставить вложение MSG в родительский MSG, используя метод MapiAttachmentCollection.Insert().

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MapiMessage msg = MapiMessage.fromFile(dataDir + "WithEmbeddedMsg.msg");
msg.getAttachments().get_Item(0).save(dataDir + "attachment_out.msg");
MapiMessage emb = MapiMessage.fromStream(new FileInputStream(dataDir + "WithEmbeddedMsg.msg"));
msg.getAttachments().insert(1, "new 11", emb);
msg.save(dataDir + "insertMSGAttachment_out.msg");

Заменить содержимое встроенного вложения MSG

Это можно использовать для замены содержимого встроенного вложения новыми, используя метод Replace. Однако, его нельзя использовать для вставки вложения с PR_ATTACH_NUM = 4 (например) в коллекцию с collection.Count = 2.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
MapiMessage msg = MapiMessage.fromFile(dataDir + "insertMSGAttachment_out.msg");
msg.getAttachments().get_Item(0).save(dataDir + "attachment_out.msg");
MapiMessage emb = MapiMessage.fromStream(new FileInputStream(dataDir + "insertMSGAttachment_out.msg"));
msg.getAttachments().replace(1, "new 1", emb);
msg.save(dataDir + "replaceEmbeddedMSGAttachment_out.msg");

Сохранение вложений из цифрово подписанного сообщения

API Aspose.Email предоставляет возможность получить или установить значение, указывающее будет ли расшифровываться ясно подписанное сообщение.

Переименование вложения в MapiMessage

Aspose.Email позволяет редактировать значение свойства DisplayName в вложениях MapiMessage.

Следующий пример кода демонстрирует, как обновить имена дисплеев первых и вторых вложений в загруженном сообщении Mapi:

MapiMessage msg = MapiMessage.load(fileName);
msg.getAttachments().get_Item(0).setDisplayName("Новое имя дисплея 1");
msg.getAttachments().get_Item(1).setDisplayName("Новое имя дисплея 2");

Проверка, является ли вложение встроенным или обычным

Разница между встроенными и обычными вложениями заключается в том, как они представлены в электронном письме. Встроенные вложения встраиваются в тело письма и могут быть просмотрены без необходимости открывать отдельный файл или что-либо загружать. Обычные вложения, с другой стороны, являются отдельными файлами, прикрепленными к письму, но не отображаются непосредственно в теле сообщения и должны быть загружены и открыты отдельно. Свойство MapiAttachment.IsInline класса MapiAttachment получает значение, указывающее, является ли вложение встроенным или обычным.

Следующий пример кода загружает сообщение электронной почты из файла и затем извлекает информацию о вложениях, в частности, выводит имя дисплея каждого вложения и является ли оно встроенным в сообщение или нет:

MapiMessage message = MapiMessage.load("fileName");

for (MapiAttachment attach : message.getAttachments()) {
    System.out.println(attach.getDisplayName() + ": " + attach.isInline());
}