sábado, 15 de enero de 2022

Microsoft Outlook desde Excel (V): Imagen en el cuerpo del mensaje (Sin errores)

Durante muchos años en internet se han publicado un sinfín de artículos sobre el envío de correo electrónico a través del VBA de Excel. Yo mismo he publicado varias cosas al respecto haciendo uso de Microsoft Outlook o, mejor dicho, a través del objeto Outlook.

En el sentido de lo mencionado en el párrafo anterior, una de las preguntas recurrentes sobre el tema es sobre cómo dar formato a los textos enviados a través del VBA y el mensaje de correo electrónico, sobre todo incluyendo imágenes en el cuerpo del mensaje y/o como firma. Si bien la respuesta inmediata, y que se puede también encontrar en diversas páginas de internet, es usar la propiedad “HTMLBody” y aplicar algo de HTML (Enlace), aunque a muchas personas les ocurre de manera recurrente que la imagen puede hasta llegar como archivo adjunto, pero no se ve en el cuerpo del mensaje o se ve como un marco vacío (no he encontrado personas que les ocurra si se usa en el cuerpo del mensaje una imagen que ya está guardada en alguna url de internet), sobre todo cuando envían a Gmail o Hotmail y más con las nuevas versiones de Office, Windows y los nuevos niveles de seguridad de los servidores.

Buscando, leyendo, indagando, etc., hace un tiempo encontré una solución al dilema mencionado, usando algunas propiedades del objeto Outlook y accediendo a propiedades de la interfaz de programación de aplicaciones de mensajería del servidor a través de los conocidos Schema de Microsoft, lo que hoy compartiré con todos/as.

Comenzaremos declarando cinco variables que son las que vamos a usar; la primera estoy seguro que ya es conocida por ustedes.

Dim outlookApp As Outlook.Application
Luego las siguientes, que dejaré comentadas para que sepan a que nos ayuda cada una:
‘Objeto mensaje de correo 
Dim mCorreo As MailItem   
‘Colección de objetos Attachment 
Dim colecAttach As Outlook.Attachments 
‘Objeto Attachment, que representa lo que vamos a adjuntar 
Dim objAttach As Outlook.Attachment 
‘Permite crear, obtener, establecer y eliminar propiedades en el objeto Outlook 
Dim proOutlook As Outlook.PropertyAccessor 
Dim Ruta$, nImagen$ 

Ahora, vamos a declarar una constante que es equivalente a una de las propiedades canónicas PidTagAttachContentId. Esta contiene el encabezado de identificación de un archivo adjunto de mensaje de extensiones multipropósito de correo de Internet. Vamos a darle el valor de un Schema de Microsoft (Data and Story Library – DASL).

Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"

Luego daremos valores a las variables:

'Creamos el objeto Outlook 
Set outlookApp = CreateObject("Outlook.Application") 
'Creamos el mensaje 
Set mCorreo = outlookApp.CreateItem(olMailItem) 
'Creamos el adjunto en el mensaje 
Set colecAttach = mCorreo.Attachments 
'Adjuntamos el archivo/Imagen 
Set objAttach = colecAttach.Add("C:\Users\eavj6\Pictures\pez.jpg") 
'Indicamos que haremos uso de una propiedad del adjunto 
Set proOutlook = objAttach.PropertyAccessor 
Ruta = "C:\Users\eavj6\Pictures\" 
nImagen = "pez.jpg" 

Lo que toca ahora es usar el método SetProperty para el nombre del Schema y el valor que nos interesa..

proOutlook.SetProperty PR_ATTACH_CONTENT_ID, "pez.jpg"

Lo que sigue debería entenderse si leyeron mis artículos anteriores jejeje.

With mCorreo
   .Close olSave     
	 .HTMLBody = "<BODY><IMG src=""cid:pez.jpg""> </BODY>" ‘aquí insertamos la imagen adjunta en el cuerpo del mensaje     
	 .Save     
	 .To = "uncorreo@gmail.com"     
	 .Subject = "Prueba"     
	 .Send
End With 

Todo junto podría quedar del siguiente modo:

Option Explicit 
'Todo Sobre Excel 
'Abraham Valencia 
'https://abrahamexcel.blogspot.com/ 
'https://www.facebook.com/TodosobreExcelAV/ 
'https://twitter.com/Todosobre_Excel 
'https://www.youtube.com/channel/UCxEe3aA5uGrtYDdboBT_ptg 
'Lima, Perú 
'Enero del 2022   

Sub ImagenenCuerpo() 

Dim outlookApp As Outlook.Application 
'Objeto mensaje de correo 
Dim mCorreo As MailItem 
'Colección de objetos Attachment 
Dim colecAttach As Outlook.Attachments 
'Objeto Attachment, que representa lo que vamos a adjuntar 
Dim objAttach As Outlook.Attachment 
'Permite crear, obtener, establecer y eliminar propiedades en el objeto Outlook 
Dim proOutlook As Outlook.PropertyAccessor 
Dim Ruta$, nImagen$ 

Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F" 

'Creamos el objeto Outlook 
Set outlookApp = CreateObject("Outlook.Application") 
'Creamos el mensaje 
Set mCorreo = outlookApp.CreateItem(olMailItem) 
'Creamos el adjunto en el mensaje 
Set colecAttach = mCorreo.Attachments 
'Adjuntamos el archivo/Imagen 
Set objAttach = colecAttach.Add("C:\Users\eavj6\Pictures\pez.jpg") 
'Indicamos que haremos uso de una propiedad del adjunto 
Set proOutlook = objAttach.PropertyAccessor 
Ruta = "C:\Users\eavj6\Pictures\" 
nImagen = "pez.jpg" 

proOutlook.SetProperty PR_ATTACH_CONTENT_ID, "pez.jpg" 

With mCorreo     
   .Close olSave     
   .HTMLBody = "<BODY><IMG src=""cid:pez.jpg""> </BODY>" 'aquí insertamos la imagen adjunta en el cuerpo del mensaje     
   .Save     
   .To = "uncorreo@gmail.com@gmail.com"     
   .Subject = "Prueba"     
   .Send 
End With      

MsgBox "Mensaje enviado", vbOKOnly, "Todo Sobre Excel" 

End Subb 

Y listo, eso es todo por hoy. Espero les sea útil. ¡Hasta la próxima!

Abraham Valencia
Lima, Perú

2 comentarios:

  1. Excelente articulo me ayudo bastante.
    Sigue compartiendo mas articulos gracias

    ResponderBorrar
  2. Encontré muchos artículos sobre cómo adjuntar imágenes en el cuerpo del correo, pero este es el único que realmente sirve. Muchas gracias.

    ResponderBorrar