Trabajar con adjuntos de mensaje

Gestionar adjuntos con Aspose Outlook

Crear y guardar archivos Outlook Message (MSG) explicó cómo crear y guardar mensajes, y cómo crear archivos MSG con adjuntos. Este artículo explica cómo gestionar los adjuntos de Microsoft Outlook con Aspose.Email. Los adjuntos de un archivo de mensaje se acceden y guardan en disco usando la propiedad Attachments de la clase MapiMessage. La propiedad Attachments es una colección del tipo clase MapiAttachmentCollection.

Verificar si el adjunto es Inline o Regular

"Adjuntos ‘Inline’ y ‘Regular’ se refieren a la forma en que se incluyen en un mensaje de correo electrónico. Los adjuntos Regular son archivos adjuntos de manera tradicional. Normalmente se muestran en una lista dentro del cliente de correo y pueden ser descargados por el destinatario y guardados en almacenamiento local. Los adjuntos Inline, también conocidos como imágenes incrustadas o inline, se usan típicamente para incluir imágenes u otros medios dentro del cuerpo del correo. No se muestran en una lista separada sino directamente dentro del contenido del correo, por ejemplo en el cuerpo del mensaje. Esto permite incluir imágenes u otros medios que forman parte del contenido del mensaje. El siguiente ejemplo de código muestra cómo determinar si un adjunto es inline o 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}")

Guardar adjuntos de un archivo Outlook Message (MSG)

Para guardar adjuntos de un archivo MSG:

  1. Itere a través de la colección MapiAttachmentCollection y obtenga los adjuntos individuales.
  2. Para guardar los adjuntos, llame al método Save() de la clase MapiAttachment.

El siguiente fragmento de código muestra cómo guardar adjuntos en el disco local.

import aspose.email as ae

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

# Create an instance of MapiMessage from file
message = ae.mapi.MapiMessage.from_file(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)

Obtener adjuntos de mensajes de correo anidados

Los adjuntos OLE incrustados también aparecen en la colección Attachment de la clase MapiMessage. El siguiente ejemplo de código analiza un archivo de mensaje en busca de adjuntos de mensaje incrustados y lo guarda en disco. El método estático FromProperties() de MapiMessage puede crear un nuevo mensaje a partir de un adjunto incrustado. El siguiente fragmento de código muestra cómo obtener adjuntos de mensajes de correo anidados.

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)

Eliminando Adjuntos

La biblioteca Aspose Outlook proporciona la funcionalidad para eliminar adjuntos de archivos Microsoft Outlook Message (.msg):

  • Llame al método RemoveAttachments(). Recibe la ruta del archivo del mensaje como parámetro. Está implementado como método estático público, por lo que no necesita instanciar el objeto.

El siguiente fragmento de código muestra cómo eliminar adjuntos.

import aspose.email as ae

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

También puede llamar al método estático DestoryAttachment() de la clase MapiMessage. Funciona más rápido que RemoveAttachment(), porque el método RemoveAttachment() analiza el archivo del mensaje.

import aspose.email as ae

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

Agregar adjuntos MSG

Un mensaje de Outlook puede contener otros mensajes de Microsoft Outlook como adjuntos, ya sea como mensajes regulares o incrustados. MapiAttachmentCollection ofrece miembros sobrecargados del método Add para crear mensajes de Outlook con ambos tipos de adjuntos.

Agregar un adjunto de referencia a un MapiMessage

"Adjunto de referencia" suele referirse a un adjunto que contiene una referencia o enlace a un recurso externo en lugar del archivo real. Estas referencias se usan a menudo en correos HTML para enlazar a imágenes o recursos alojados en un servidor remoto. En lugar de incrustar el archivo completo, un adjunto de referencia incluye una URL o referencia al contenido externo.

Aspose.Email ofrece un conjunto de herramientas para la correcta visualización de adjuntos de referencia, presentadas en el siguiente ejemplo de código:

import aspose.email as ae

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

# Add reference attachment
msg.attachments.add("Document.pdf",
    "https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
    "https://drive.google.com/drive/my-drive",
    "GoogleDrive")

# Also, you can set additional attachment properties
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_PERMISSION_TYPE, int(ae.AttachmentPermissionType.ANYONE_CAN_EDIT))
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_ORIGINAL_PERMISSION_TYPE, 0)
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_IS_FOLDER, False)
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_PROVIDER_ENDPOINT_URL, "")
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_PREVIEW_URL, "")
msg.attachments[0].set_property(ae.mapi.KnownPropertyList.ATTACHMENT_THUMBNAIL_URL, "")
# Finally save the message
msg.save("msg_with_ref_attach.msg")

Incrustar un mensaje como adjunto

El siguiente fragmento de código muestra cómo los archivos MSG de Outlook incrustados en un archivo MSG contienen un PR_ATTACH_METHOD cuyo valor es 5.

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")

Leer Mensajes Incrustados de Adjuntos

El siguiente fragmento de código muestra cómo leer un mensaje incrustado desde un adjunto.

import aspose.email as ae

file_name = "path/to/file.msg"

# Load the MapiMessage from file
message = ae.mapi.MapiMessage.from_file(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
    # ...

Inserción y reemplazo de adjuntos

La API de Aspose.Email permite insertar adjuntos en un índice específico del mensaje padre. También ofrece la facilidad de reemplazar el contenido de un adjunto con otro adjunto de mensaje. El siguiente fragmento de código muestra la inserción y el reemplazo de adjuntos.

Insertar en ubicación específica

La API de Aspose.Email permite insertar un adjunto MSG en un MSG padre usando el método Insert de MapiAttachmentCollection: MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). El siguiente fragmento de código muestra cómo insertar en una ubicación específica.

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)

Reemplazar Contenido del Adjuntos

Esto puede usarse para reemplazar el contenido de un adjunto incrustado con los nuevos usando el método Replace. Sin embargo, no puede usarse para insertar un adjunto con PR_ATTACH_NUM = 4 (por ejemplo) en una colección con collection.Count = 2. El siguiente fragmento de código muestra cómo reemplazar el contenido de un adjunto.

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)

Renombrar un adjunto en un MapiMessage

Es posible modificar los nombres para mostrar de los adjuntos en mensajes de correo cargados desde un archivo. El siguiente ejemplo de código muestra cómo hacerlo:

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"