Управление вложениями в сообщениях Outlook

Этот Создание и сохранение сообщений Outlook (файлы MSG) в статье объяснены шаги создания и сохранения сообщений, включая файлы MSG с вложениями. Эта статья рассматривает управление вложениями Microsoft Outlook с помощью Aspose.Email. Она проведет вас через процесс доступа к вложениям и их сохранения из файла сообщения с использованием attachments свойство MapiMessage класс. Это свойство представляет собой коллекцию, принадлежащую MapiAttachmentCollection класс, позволяющий эффективно работать с вложениями.

Проверка Inline и Regular вложений

"Inline" и "Regular" вложения относятся к способу их включения в email‑сообщение. Regular вложения — это файлы, прикрепленные традиционным способом. Они обычно отображаются в списке внутри почтового клиента и могут быть загружены получателем и сохранены в локальное хранилище. Inline вложения, также известные как встроенные или inline‑изображения, обычно используются для включения изображений или другого медиа непосредственно в тело письма. Они не отображаются в отдельном списке, а показываются прямо в содержимом письма, например, в его теле. Это позволяет включать изображения или другие медиа, являющиеся частью содержимого сообщения. Пример кода ниже демонстрирует, как определить, является ли вложение inline или regular:

import aspose.email as ae

msg = ae.mapi.MapiMessage.load("message.msg")

for attachment in msg.attachments:
    print(f"{attachment.display_name}:{attachment.is_inline}")

Определение ссылочных вложений в сообщениях MAPI

API Aspose.Email включает is_reference свойство MapiAttachment класс, который позволяет разработчикам определять ссылочные вложения в сообщении. Попробуйте пример кода ниже, чтобы увидеть, как он работает в проекте на Python:

import aspose.email as ae

# Load or create a MapiMessage
msg = ae.mapi.MapiMessage.load("Message_With_Reference_Attachment.msg")

# Iterate through the attachments
for attachment in msg.attachments:
    if attachment.is_reference:
        # Process reference attachment
        pass

Сохранение вложений из файлов MSG

Чтобы сохранить вложения из файла MSG:

  1. Итерируйтесь по MapiAttachmentCollection коллекцию и получайте отдельные вложения.
  2. Чтобы сохранить вложения, вызовите MapiAttachment класс Save() метод.

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

import aspose.email as ae

data_dir = "C://dataDir/"
file_name = "message.msg"

# Create an instance of MapiMessage from file
message = ae.mapi.MapiMessage.load(data_dir + file_name)

# Iterate through the attachments collection
for attachment in message.attachments:
    # Save the individual attachment
    attachment.save(data_dir + attachment.file_name)

Обработка вложений TNEF

Загрузка и сохранение вложений в формате TNEF

Aspose.Email предоставляет методы для работы с вложениями TNEF. Эти методы позволяют сохранять и загружать вложения в формате TNEF, часто используемом в сообщениях Outlook (winmail.dat).

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

import io
from aspose.email.mapi import MapiMessage, MapiAttachment

# Load the EML message (which contains a winmail.dat TNEF attachment)
msg = MapiMessage.load("message.eml")

# Save the first attachment as a winmail.dat file
msg.attachments[0].save_to_tnef("winmail.dat")

# Load the TNEF attachment from the file and add it back to the message
from_tnef_attachment = MapiAttachment.load_from_tnef("winmail.dat")
msg.attachments.add(from_tnef_attachment.long_file_name, from_tnef_attachment.binary_data)

# (Optional) If you also want to use a memory stream instead of the file
ms = io.BytesIO()
msg.attachments[0].save_to_tnef(ms)

# Reset the stream position to the beginning
ms.seek(0)

# Load the TNEF attachment directly from the memory stream and add it
from_tnef_attachment_from_stream = MapiAttachment.load_from_tnef(ms)
msg.attachments.add(from_tnef_attachment_from_stream.long_file_name, from_tnef_attachment_from_stream.binary_data)

Получение вложенных почтовых сообщений

Встроенные OLE (Object Linking and Embedding) вложения также появляются в коллекции вложений MapiMessage класс. Пример кода ниже демонстрирует, как разобрать файл сообщения и извлечь встроенные вложения сообщений, затем сохранить их на диск для дальнейшего использования. MapiMessage класс предлагает from_properties статический метод для создания нового сообщения из встроенного вложения. В следующем фрагменте кода показано, как получить вложения вложенных почтовых сообщений:

import aspose.email as ae

eml = ae.mapi.MapiMessage.load("my.msg")

# Create a MapiMessage object from the individual attachment
get_attachment = ae.mapi.MapiMessage.from_properties(eml.attachments[0].object_data.properties)

# Create an object of type MailMessageInterpreter from the above message and save the embedded message to a file on disk
mail_message = get_attachment.to_mail_message(ae.mapi.MailConversionOptions())
mail_message.save("NestedMailMessageAttachments_out.eml", ae.SaveOptions.default_eml)

Удалить вложения

Библиотека Aspose.Email предоставляет возможность удалять вложения из файлов Microsoft Outlook Message (.msg). Используйте remove_attachments(path) метод, который требует путь к файлу сообщения в качестве параметра. Как публичный статический метод, его можно вызвать напрямую без необходимости создавать объект, что делает процесс простым и эффективным.

В следующем фрагменте кода показано, как удалить вложения из файлов MSG с помощью Aspose.Email:

import aspose.email as ae

ae.mapi.MapiMessage.remove_attachments("AttachmentsToRemove_out.msg")

Вы также можете вызвать статический метод destroy_attachments класса MapiMessage класс. Он работает быстрее, чем remove_attachments, потому что метод remove_attachments парсит файл сообщения.

import aspose.email as ae

# Destroy attachments in the MapiMessage
ae.mapi.MapiMessage.destroy_attachments("AttachmentsToDestroy_out.msg")

Добавление вложений MSG

Сообщение Outlook может содержать другие сообщения Microsoft Outlook во вложениях, как обычные, так и встроенные. MapiAttachmentCollection предоставляет перегруженные члены добавить метод для создания сообщений Outlook с обоими типами вложений.

Добавление ссылочных вложений в сообщения MAPI

Ссылочное вложение обычно относится к вложению, которое содержит ссылку на внешний ресурс, а не сам файл. Такие ссылки часто используют в HTML‑письмах для указания внешних изображений или ресурсов, размещённых на удалённом сервере. Вместо встраивания полного файла, ссылочное вложение включает URL или ссылку на внешний контент.

Чтобы добавить ссылочное вложение в сообщение MAPI, используйте add метод MapiAttachmentCollection class и ReferenceAttachmentOptions класс для указания:

  • URL содержимого (прямая ссылка на файл)

  • URL провайдера (ссылка на расположение файла или UI‑просмотр)

  • Имя провайдера вложений (например, "GoogleDrive")

как показано в примере кода ниже.

import aspose.email as ae

# Load or create a MapiMessage
msg = ae.mapi.MapiMessage()
msg.subject = "Email with Reference Attachment"
msg.body = "This message contains a cloud-based reference attachment."

# Create ReferenceAttachmentOptions
options = ae.mapi.ReferenceAttachmentOptions(
    "https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
    "https://drive.google.com/drive/my-drive",
    "GoogleDrive"
)

# Add the reference attachment to the message
msg.attachments.add("Document.pdf", options)

# Save the message to MSG format
msg.save("Message_With_Reference_Attachment.msg")

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

В следующем фрагменте кода показано, как встраивать файлы Outlook MSG в качестве вложений в другой файл MSG. Встроенный файл MSG содержит свойство PR_ATTACH_METHOD со значением 5, что указывает, что это вложение типа "message".

import aspose.email as ae

# Create a new MapiMessage
message = ae.mapi.MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body")

# Load the attachment message
attach_msg = ae.mapi.MapiMessage.load("Message.msg")

# Add the attachment to the message
message.attachments.add("Weekly report.msg", attach_msg)

# Save the message with the embedded message attachment
message.save("WithEmbeddedMsg_out.msg")

Чтение встроенных сообщений из вложений

В следующем фрагменте кода показано, как читать встроенные сообщения из вложений.

import aspose.email as ae

file_name = "path/to/file.msg"

# Load the MapiMessage from file
message = ae.mapi.MapiMessage.load(file_name)

# Check if the first attachment is an Outlook message
if message.attachments[0].object_data.is_outlook_message:
    # Get the embedded message as MapiMessage
    embedded_message = message.attachments[0].object_data.to_mapi_message()
    # Perform further operations with the embedded message
    # ...

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

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

Вставка вложений в определённые места

Aspose.Email API позволяет вставить вложение MSG в родительский MSG, используя метод Insert класса MapiAttachmentCollection. Этот метод используется с сигнатурой MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). Ниже приведён фрагмент кода, иллюстрирующий, как вставить вложение в определённое место:

import aspose.email as ae
from io import BytesIO

file_name = "path/to/file.msg"

# Load the MapiMessage from file
message = ae.mapi.MapiMessage.load(file_name)

# Save the attachment to a memory stream
memory_stream = BytesIO()
message.attachments[2].save(memory_stream)

# Load the attachment from the memory stream
get_data = ae.mapi.MapiMessage.load(memory_stream)

# Insert the loaded attachment at index 1
message.attachments.insert(1, "new 11", get_data)

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

Вы можете использовать replace метод для обновления содержимого вложенного вложения новыми данными. Однако обратите внимание, что этот метод нельзя использовать для вставки вложения с PR_ATTACH_NUM = 4 в коллекцию, содержащую только 2 вложения. Ниже приведён фрагмент кода, демонстрирующий, как заменить содержимое вложения:

import aspose.email as ae
from io import BytesIO
file_name = "path/to/file.msg"

# Load the MapiMessage from file
message = ae.mapi.MapiMessage.load(file_name)

# Save the attachment to a memory stream
memory_stream = BytesIO()
message.attachments[2].save(memory_stream)

# Load the attachment from the memory stream
get_data = ae.mapi.MapiMessage.load(memory_stream)

# Replace the attachment at index 1 with the loaded attachment
message.attachments.replace(1, "new 1", get_data)

Переименование вложений в MapiMessages

С помощью Aspose.Email вы можете легко изменить отображаемые имена вложений в email‑сообщениях, загруженных из файла. Следующий пример кода демонстрирует, как это сделать:

import aspose.email as ae

msg = ae.mapi.MapiMessage.load("message.msg")

msg.attachments[0].display_name = "New display name 1"
msg.attachments[1].display_name = "New display name 2"