Работа с вложениями и внедрёнными объектами
Управление вложениями электронной почты
Вложение к письму — это файл, отправляемый вместе с сообщением электронной почты. Файл может быть отправлен как отдельное сообщение, так и как часть сообщения, к которому он прикреплён. The Attachment класс используется с MailMessage класс. Все сообщения включают тело. Помимо тела, вы можете захотеть отправить дополнительные файлы. Они отправляются как вложения и представлены как экземпляр Attachment класс. Вы можете отправлять любое количество вложений, но размер вложения ограничивается сервером почты. Например, Gmail не поддерживает файлы размером более 10 МБ.
Попробуйте!
Добавляйте или удаляйте вложения к письмам онлайн бесплатно Приложение Aspose.Email Editor.
Добавление вложения
Чтобы прикрепить вложение к email, выполните следующие шаги:
- Создать экземпляр MailMessage класс.
- Создать экземпляр Attachment класс.
- Загрузите вложение в Attachment экземпляр.
- Добавьте Attachment экземпляр в MailMessage экземпляр.
Следующий фрагмент кода показывает, как добавить вложение к email.
// Create an instance of MailMessage class
MailMessage message = new MailMessage();
message.setFrom(new MailAddress("sender@from.com"));
message.getTo().add("receiver@to.com");
message.setSubject("This is message");
message.setBody("This is body");
// Load an attachment
Attachment attachment = new Attachment("1.txt");
// Add Multiple Attachment in instance of MailMessage class and Save message to disk
message.getAttachments().addItem(attachment);
message.addAttachment(new Attachment("1.jpg"));
message.addAttachment(new Attachment("1.doc"));
message.addAttachment(new Attachment("1.rar"));
message.addAttachment(new Attachment("1.pdf"));
message.save("AddAttachments.eml");
Выше мы описали, как добавлять вложения к вашему сообщению email с помощью Aspose.Email. Далее показано, как удалять вложения и отображать информацию о них на экране.
Удаление вложения
Чтобы удалить вложение, выполните приведённые ниже шаги:
- Создайте экземпляр Attachment класс.
- Загрузите вложение в экземпляр Attachment класс.
- Добавьте вложение в экземпляр MailMessage класс.
- Удалите вложения из экземпляра Attachment класс, используя MailMessage экземпляр класса.
Следующий фрагмент кода показывает, как удалить вложение.
// Create an instance of MailMessage class
MailMessage eml = new MailMessage();
eml.setFrom(new MailAddress("sender@from.com"));
eml.getTo().add("receiver@to.com");
// Load an attachment
Attachment attachment = new Attachment("1.txt");
eml.getAttachments().addItem(attachment);
// Remove attachment from your MailMessage
eml.getAttachments().removeItem(attachment);
Отображение имени файла вложения
Чтобы отобразить имя файла вложения, выполните следующие шаги:
- Пройдитесь по вложениям в сообщении email и
- Сохраните каждое вложение.
- Отобразите имя каждого вложения на экране.
Следующий фрагмент кода показывает, как отобразить имя файла вложения на экране.
MailMessage eml = MailMessage.load("Attachments.eml");
for (Attachment attachment : eml.getAttachments()) {
// Display the attachment file name
System.out.println(attachment.getName());
}
Извлечение вложений из email
В этой теме объясняется, как извлечь вложение из файла email. Вложение email — это файл, отправляемый вместе с сообщением email. Файл может быть отправлен как отдельное сообщение, так и как часть сообщения, к которому он прикреплён. Все сообщения email включают возможность отправлять дополнительные файлы. Они отправляются как вложения и представлены в виде экземпляров Attachment класс. The Attachment класс используется с MailMessage класс для работы с вложениями. Чтобы извлечь вложения из сообщения email, выполните следующие шаги:
- Создать экземпляр MailMessage класс.
- Загрузите файл email в MailMessage экземпляр.
- Создать экземпляр Attachment класс и используйте его в цикле для извлечения всех вложений.
- Сохраните вложение и отобразите его на экране.
|Извлечённые вложения в email| | :- | |
| Следующий фрагмент кода показывает, как извлечь вложения из email.
MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());
for (Attachment attachment : eml.getAttachments()) {
attachment.save("MessageEmbedded_out.eml");
System.out.println(attachment.getName());
}
Получение Content-Description из вложения
API Aspose.Email предоставляет возможность считывать Content-Description вложения из заголовка вложения. Следующий фрагмент кода показывает, как получить описание содержимого из вложения.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));
Определение, является ли вложение вложенным сообщением
Следующий фрагмент кода демонстрирует, как определить, является ли вложение вложенным сообщением.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).isEmbeddedMessage()
? "Attachment is an embedded message."
: "Attachment isn't an embedded message.");
Определение TNEF‑форматированных вложений
Этот Attachment.isTnef свойство API Aspose.Email для Java указывает, является ли вложение сообщения форматом TNEF.
Следующий фрагмент кода демонстрирует, как определить, является ли вложение форматом TNEF:
MailMessage eml = MailMessage.load(fileName);
for (Attachment attachment : eml.getAttachments()) {
System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}
Загрузка и сохранение TNEF‑вложений
Aspose.Email for Java предоставляет методы в MapiAttachment класс для выполнения следующих операций:
Загрузить из TNEF
-
static MapiAttachment loadFromTnef(String fileName)– Загружает вложение из файла TNEF. -
static MapiAttachment loadFromTnef(InputStream stream)– Загружает вложение из потока TNEF.
Сохранить в TNEF
-
void saveToTnef(String fileName)– Сохраняет вложение в файл TNEF. -
void saveToTnef(OutputStream stream)– Сохраняет вложение в поток TNEF.
Следующий пример кода демонстрирует, как извлечь TNEF‑вложение из сообщения, сохранить его в поток или файл, а затем загрузить обратно в сообщение как MapiAttachment:
// Load message containing a TNEF attachment (winmail.dat)
MapiMessage msg = MapiMessage.load("message.eml");
// Save the first attachment to a TNEF stream
ByteArrayOutputStream bos = new ByteArrayOutputStream();
msg.getAttachments().get(0).saveToTnef(bos);
// Load attachment back from the TNEF stream
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
MapiAttachment fromtnefAttachment = MapiAttachment.loadFromTnef(bis);
msg.getAttachments().addMapiAttachment(fromtnefAttachment);
// Load TNEF attachment directly from a file
fromtnefAttachment = MapiAttachment.loadFromTnef("winmail.dat");
msg.getAttachments().addMapiAttachment(fromtnefAttachment);
Извлечение URI вложения, если вложение является URI‑вложением
Следующий фрагмент кода демонстрирует, как извлечь URI вложения.
MailMessage eml = MailMessage.load("fileName");
Attachment attachment = eml.getAttachments().get_Item(0);
if (attachment.isUri()) {
InputStream inputStream = attachment.getContentStream();
String uri = new String(IOUtils.toByteArray(inputStream), Charset.forName("utf-8"));
System.out.println("Attachment URI: " + uri);
}
Добавление ссылочных вложений
Ссылочное вложение — это альтернатива локальному файловому вложению. В некоторых случаях ссылочные вложения могут быть предпочтительнее, например, если требуется управлять их доступом. Ниже приведённые классы используются для управления и обработки сообщений email и их вложений:
- ReferenceAttachment - Представляет ссылочное вложение.
- AttachmentPermissionType - Данные типа разрешения, связанные с вложением ссылки веб‑ресурса.
- AttachmentProviderType - Тип веб‑сервиса, который обрабатывает вложение.
Следующий образец кода демонстрирует, как загрузить сообщение email из файла, создать ссылочное вложение с определёнными свойствами и добавить вложение к сообщению email:
MailMessage eml = MailMessage.load("fileName");
ReferenceAttachment refAttach = new ReferenceAttachment("https://[attach_uri]")
refAttach.setName("Document.docx");
refAttach.setProviderType(AttachmentProviderType.OneDrivePro);
refAttach.setPermissionType(AttachmentPermissionType.AnyoneCanEdit);
eml.getAttachments().addItem(refAttach);
Работа с вложенными объектами
Вложенный объект — это объект, созданный в одном приложении и включённый в документ или файл, созданный другим приложением. Например, таблицу Microsoft Excel можно вложить в отчёт Microsoft Word, а видеофайл — во презентацию Microsoft PowerPoint. При вложении файла, а не его вставке или копировании в другой документ, он сохраняет исходный формат. Вложенный документ можно открыть в оригинальном приложении и изменить его.
Встраивание объектов в email
Этот LinkedResource класс используется с MailMessage класс для встраивания объектов в ваши сообщения email. Чтобы добавить вложенный объект, выполните следующие действия
- Создать экземпляр MailMessage класс.
- Укажите значения From, To и Subject в MailMessage экземпляр.
- Создать экземпляр AlternateView класс.
- Создать экземпляр LinkedResource класс.
- Загрузите вложенный объект в LinkedResourceCollection.
- Добавьте загруженный вложенный объект в MailMessage экземпляр класса.
- Добавьте AlternateView экземпляр к MailMessage экземпляр класса.
Приведённые ниже фрагменты кода создают сообщение email с текстовыми и HTML‑телами, а также изображением, встроенным в HTML
|Изображение, встроенное в email| | :- | |
| Вы можете отправлять любое количество вложенных объектов. Размер вложения ограничен почтовым сервером. Например, Gmail не поддерживает файлы размером более 10 МБ. Приведённые ниже фрагменты кода демонстрируют, как встраивать объекты в Email.
// Create an instance of the MailMessage class and Set the addresses and Set the content
MailMessage mail = new MailMessage();
mail.setFrom(new MailAddress("sender@from.com"));
mail.getTo().add("receiver@to.com");
mail.setSubject("This is an email");
// Create the plain text part It is viewable by those clients that don't support HTML
AlternateView plainView = AlternateView.createAlternateViewFromString("This is my plain text content", null, "text/plain");
// Create the HTML part.To embed images, we need to use the prefix 'cid' in the img src value.
// The cid value will map to the Content-Id of a Linked resource.
// Thus <img src='cid:barcode'> will map to a LinkedResource with a ContentId of //'barcode'.
AlternateView htmlView = AlternateView.createAlternateViewFromString("Here is an embedded image.<img src=cid:barcode>", null, "text/html");
// Create the LinkedResource (embedded image) and Add the LinkedResource to the appropriate view
LinkedResource barcode = new LinkedResource("1.jpg", MediaTypeNames.Image.JPEG);
barcode.setContentId("barcode");
mail.getLinkedResources().addItem(barcode);
mail.getAlternateViews().addItem(plainView);
mail.getAlternateViews().addItem(htmlView);
mail.save("EmbeddedImage_out.msg", SaveOptions.getDefaultMsgUnicode());
Удаление вложенных объектов из email
LinkedResourceCollection доступен через MailMessage.LinkedResources свойства. The LinkedResourceCollection коллекция предоставляет метод для полного удаления вложенных объектов, добавленных в сообщение email. Используйте перегруженную версию LinkedResourceCollection.removeAt метод для удаления всех следов вложенного объекта из сообщения email.
Пример кода ниже показывает, как удалить вложенные объекты из сообщения email.
// Load the test message with Linked Resources
MailMessage msg = MailMessage.load("EmlWithLinkedResources.eml");
// Remove a LinkedResource
msg.getLinkedResources().removeAt(0, true);
// Now clear the Alternate View for linked Resources
msg.getAlternateViews().get_Item(0).getLinkedResources().clear(true);
Извлечение вложенных объектов
В этой теме объясняется, как извлекать вложенные объекты из файла email. Вложенный объект — это объект, созданный в одном приложении и включённый в документ или файл, созданный другим приложением. Например, таблицу Microsoft Excel можно вложить в отчёт Microsoft Word, а видеофайл — во презентацию Microsoft PowerPoint. При вложении файла, а не его вставке или копировании в другой документ, он сохраняет свой исходный формат. Вложенный документ можно открыть в оригинальном приложении и изменить его. Чтобы извлечь вложенный объект из сообщения email, выполните следующие шаги:
- Создать экземпляр MailMessage класс.
- Загрузите файл email в MailMessage экземпляр.
- Создайте цикл и создайте экземпляр Attachment класс в нём.
- Сохраните вложение и отобразите его на экране.
- Укажите адрес отправителя и получателя в MailMessage экземпляр.
- Отправить email, используя SmtpClient класс.
Ниже приведённый фрагмент кода извлекает внедрённые объекты из письма.
|Извлечённые внедрённые объекты в письме| | :- | |
| Следующий фрагмент кода показывает, как извлечь внедрённые объекты.
MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());
for (Attachment attachment : mailMsg.getAttachments()) {
attachment.save("MessageEmbedded_out.msg");
System.out.println(attachment.getName());
}
Идентификация и извлечение внедрённого вложения из MSG, отформатированного как RTF
Следующий код можно использовать для сообщений, отформатированных как RTF, чтобы различать и извлекать вложения, которые находятся в виде Inline или отображаются как иконка в теле сообщения. Ниже приведён фрагмент кода, показывающий, как идентифицировать и извлечь внедрённое вложение из MSG, отформатированного как RTF.
public static void extractInlineAttachments() {
MapiMessage message = MapiMessage.load("MSG file with RTF Formatting.msg");
for (MapiAttachment attachment : message.getAttachments()) {
if (isAttachmentInline(attachment)) {
try {
saveAttachment(attachment, UUID.randomUUID().toString());
} catch (Exception ex) {
System.err.println(ex);
}
}
}
}
static boolean isAttachmentInline(MapiAttachment attachment) {
for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
if ("\u0003ObjInfo".equals(property.getName())) {
byte[] data = property.getData();
int odtPersist1 = data[1] << 8 | data[0];
return (odtPersist1 & 0x40) == 0;
}
}
return false;
}
static void saveAttachment(MapiAttachment attachment, String fileName) throws IOException {
for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
if ("Package".equals(property.getName())) {
try (FileOutputStream fs = new FileOutputStream(fileName)) {
fs.write(property.getData(), 0, property.getData().length);
}
}
}
}
Получение вложений из подписанного письма
Подписанные письма содержат единственное вложение smime.p7m. Это означает, что письмо зашифровано SMIME. Формат файла smime.p7m представляет цифровую подпись. Чтобы просмотреть содержимое этого письма, используйте RemoveSignature метод. Метод возвращает MailMessage объект без цифровой подписи.
MailMessage signedEml = MailMessage.load("signed.eml");
if (signedEml.isSigned()) {
for (int i = 0; i < signedEml.getAttachments().size(); i++) {
System.out.println("Signed email attachment" + i + ": " + signedEml.getAttachments().get_Item(i).getName());
}
// The email is signed. Remove a signature.
MailMessage eml = signedEml.removeSignature();
System.out.println("Signature removed.");
for (int i = 0; i < eml.getAttachments().size(); i++) {
System.out.println("Email attachment" + i + ": " + eml.getAttachments().get_Item(i).getName());
}
}
Работа с Content-Type и Content-Disposition
API Aspose.Email предоставляет возможность работать с вложением Content-Type и Content-Disposition из заголовка вложения. Следующий фрагмент кода показывает, как получить и изменить описание содержимого во вложении.
Отображение параметров Content-Type и Content-Disposition
Следующий фрагмент кода показывает, как отобразить параметры Content-Type и Content-Disposition на экране:
void run(MailMessage message) {
// Attachments
for (Attachment attachment : message.getAttachments()) {
ContentDisposition contentDisposition = attachment.getContentDisposition();
printContentDisposition(contentDisposition);
ContentType contentType = attachment.getContentType();
printContentType(contentType);
}
// Linked Resources
for (LinkedResource attachment : message.getLinkedResources()) {
ContentDisposition contentDisposition = attachment.getContentDisposition();
printContentDisposition(contentDisposition);
ContentType contentType = attachment.getContentType();
printContentType(contentType);
}
}
void printContentType(ContentType contentType) {
System.out.println("media-type: " + contentType.getMediaType());
System.out.println("charset: " + contentType.getCharSet());
System.out.println("name: " + contentType.getName());
}
void printContentDisposition(ContentDisposition contentDisposition) {
System.out.println("disposition-type: " + contentDisposition.getDispositionType());
System.out.println("is-inline: " + contentDisposition.getInline());
System.out.println("filename: " + contentDisposition.getFileName());
System.out.println("creation-date: " + contentDisposition.getCreationDate());
System.out.println("modification-date: " + contentDisposition.getModificationDate());
System.out.println("read-date: " + contentDisposition.getReadDate());
System.out.println("size: " + contentDisposition.getSize());
}
Использование параметров Content-Type и Content-Disposition во вложениях
Следующий фрагмент кода показывает, как использовать параметры Content-Type и Content-Disposition во вложении:
MailMessage eml = MailMessage.load(fileName);
Attachment attachment = new Attachment(pdfFileName, new ContentType("application/octet-stream"));
attachment.getContentDisposition().setDispositionType("attachment");
attachment.getContentDisposition().setFileName(fileName);
eml.addAttachment(attachment);