Access

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:

  • Incluya etiquetas HTML en el cuerpo del correo electrónico.
  • Asegúrese de que las comillas se escapen correctamente dentro de la cadena JSON.
    • 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.

    Publicaciones relacionadas

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Botón volver arriba