
Nueva solución alternativa para la automatización de Outlook: creación de su propia API REST
Lo ha leído aquí, lo ha leído en todas partes (espero) que el nuevo Outlook ya no admitirá la automatización de VBA, lo que pondrá en peligro nuestra solución empresarial crítica.
Ahora, he intentado ofrecer algunas posibles alternativas y soluciones, como por ejemplo:


También mencioné cambiar a Thunderbird, que puede automatizarse para enviar correos electrónicos.
Hoy pensé en ofrecer otra posible solución. En lugar de acceder a la API REST de Microsoft o Google, ¿qué tal si creas la tuya propia?
Ahora, esto implica que tienes tu propio servidor o dominio web, pero si lo tienes, este podría ser el boleto para recuperar algo de control sobre la situación y lo mejor es que puedes personalizarlo como mejor te parezca.
¿Qué es una API web ‘REST’?
Una API REST es un conjunto de reglas para la comunicación entre programas informáticos a través de Internet. Esto es lo que realmente está sucediendo:
- Pedido
Un programa (como una aplicación móvil, un sitio web, Excel, Access) envía una solicitud a una URL específica.
- Transferencia de datos: la solicitud puede incluir datos (como información del formulario o parámetros de búsqueda), pero no es necesario.
- Tratamiento
Un servidor recibe esta solicitud y la procesa.
- Respuesta
El servidor devuelve un estado y una respuesta, normalmente en un formato como JSON o XML.
Las API REST están diseñadas para no tener estado (cada solicitud contiene toda la información necesaria) y utilizar formatos estándar, lo que las hace ampliamente compatibles y fáciles de usar en diferentes sistemas y lenguajes de programación.
Entonces, ¿cómo podemos utilizar esto?
Simple, podemos crear nuestra propia API REST que aceptará una cadena JSON que contiene información de correo electrónico.
- Dirección de correo electrónico del destinatario
- Sujeto
- Cuerpo
y luego use esto para enviar un correo electrónico y devolver a nuestro programa VBA un mensaje que indique el éxito o el fracaso.
Los componentes de la API REST
En este ejemplo, estamos creando una API REST PHP muy simple. Básicamente funcionará con 2 componentes:
- Un script PHP (nuestra API REST)
- Un procedimiento VBA utilizado para llamar a la API
La API REST
El concepto básico sería así:
<?php header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Max-Age: 3600"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); if ($_SERVER('REQUEST_METHOD') === 'POST') { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (isset($data('to')) && isset($data('subject')) && isset($data('body'))) { $to = filter_var($data('to'), FILTER_SANITIZE_EMAIL); $subject = $data('subject'); $message = $data('body'); $headers = "From: YourEmail@YourDomain.com\r\n"; //Replace me $headers .= "Reply-To: YourEmail@YourDomain.com\r\n"; //Replace me $headers .= "X-Mailer: PHP/" . phpversion(); if (filter_var($to, FILTER_VALIDATE_EMAIL)) { if (mail($to, $subject, $message, $headers)) { http_response_code(200); echo json_encode(array("message" => "Email sent successfully to $to.")); } else { http_response_code(500); echo json_encode(array("message" => "Failed to send email.")); } } else { http_response_code(400); echo json_encode(array("message" => "Invalid email address provided.")); } } else { http_response_code(400); echo json_encode(array("message" => "To, subject, and body are required.")); } } else { http_response_code(405); echo json_encode(array("message" => "Method not allowed. Use POST.")); } ?>
Una vez creado, deberá cargarlo en su dominio en una carpeta de su elección. Su ubicación y nombre de archivo dependen de usted, pero serán necesarios en el procedimiento de VBA.
El procedimiento VBA
El lado de VBA es bastante sencillo, ya que es sólo cuestión de realizar una solicitud HTTP y leer la respuesta. Como tal, el código se parecería un poco a:
Sub SendEmailViaAPI() Dim objHTTP As Object Dim url As String Dim jsonData As String ' Create WinHttpRequest object Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") ' API endpoint URL url = "URLToThePHPFileOnYourServer" //ie: ' Prepare JSON data jsonData = "{""to"":""Recipient@EmailAddress.com"",""subject"":""Your Subject Line"",""body"":""Your Actual Email Content.""}" ' Send POST request With objHTTP .Open "POST", url, False .setRequestHeader "Content-Type", "application/json" .send jsonData ' Check the response If .Status = 200 Then MsgBox "Email sent successfully: " & .responseText Else 'We have a problem! MsgBox "Error: " & .Status & " - " & .responseText End If End With Set objHTTP = Nothing End Sub
Correos electrónicos HTML que usted dice
Lo anterior demostró los conceptos básicos del envío de correos electrónicos de texto sin formato, pero permitir contenido HTML no es mucho más complejo. Podemos modificar ligeramente tanto el código PHP como VBA de la siguiente manera:
Para el código PHP:
- Agregue un encabezado de versión MIME.
- Cambie el encabezado de tipo de contenido para especificar HTML.
Para el código VBA:
Estas modificaciones permiten el envío de correos electrónicos con formato HTML a través de la API REST. A continuación se muestran ejemplos de las modificaciones requeridas:
PHP
<?php header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Max-Age: 3600"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); if ($_SERVER('REQUEST_METHOD') === 'POST') { $json = file_get_contents('php://input'); $data = json_decode($json, true); if (isset($data('to')) && isset($data('subject')) && isset($data('body'))) { $to = filter_var($data('to'), FILTER_SANITIZE_EMAIL); $subject = $data('subject'); $message = $data('body'); $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; $headers .= "From: YourEmail@YourDomain.com\r\n"; $headers .= "Reply-To: YourEmail@YourDomain.com\r\n"; $headers .= "X-Mailer: PHP/" . phpversion(); if (filter_var($to, FILTER_VALIDATE_EMAIL)) { if (mail($to, $subject, $message, $headers)) { http_response_code(200); echo json_encode(array("message" => "Email sent successfully to $to.")); } else { http_response_code(500); echo json_encode(array("message" => "Failed to send email.")); } } else { http_response_code(400); echo json_encode(array("message" => "Invalid email address provided.")); } } else { http_response_code(400); echo json_encode(array("message" => "To, subject, and body are required.")); } } else { http_response_code(405); echo json_encode(array("message" => "Method not allowed. Use POST.")); } ?>
Vba
Sub SendHTMLEmailViaAPI() Dim objHTTP As Object Dim url As String Dim jsonData As String Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") url = "URLToThePHPFileOnYourServer" //ie: jsonData = "{""to"":""Recipient@EmailAddress.com"",""subject"":""Your Subject Line"",""body"":""<html><body><h1>Hello</h1><p>This is a REST API HTML email.</p></body></html>""}" With objHTTP .Open "POST", url, False .setRequestHeader "Content-Type", "application/json" .send jsonData If .Status = 200 Then MsgBox "Email sent successfully: " & .responseText Else MsgBox "Error: " & .Status & " - " & .responseText End If End With Set objHTTP = Nothing End Sub
Fácilmente podríamos llevar las cosas aún más lejos para hacer que la API REST agregue destinatarios de correo electrónico CC y BCC, archivos adjuntos,…
Consideraciones adicionales
Lo anterior es sólo un punto de partida. Como la seguridad es fundamental, estas técnicas deben bloquearse lo mejor posible, por lo que algunas ideas que me vienen a la mente rápidamente incluyen:
- Agregar algún tipo de clave de autenticación que debe proporcionarse como parte de la solicitud
- Agregar un sistema de registro para que pueda validar cuándo se está ejecutando el script (podría ser un correo electrónico, registrado en una tabla de base de datos, un archivo,…)
- Coloque el archivo PHP en una carpeta segura que requiera credenciales de inicio de sesión (modifique el procedimiento de VBA para incluir dicha información de autenticación)
Conclusión
El hecho de que podamos automatizar los correos electrónicos utilizando nuestra propia API REST personalizada nos ofrece una solución potencial más para las limitaciones que nos impone el nuevo Outlook de Microsoft.
Al aprovechar las API REST personalizadas, los desarrolladores de VBA pueden crear aplicaciones más potentes, flexibles e interconectadas, superando las limitaciones tradicionales y abriendo nuevas vías para la automatización y la gestión de datos y ampliando significativamente las capacidades de las aplicaciones locales.