Respuestas automáticas a formularios web con eMayordomo

Cuando me preguntan qué es Google Apps Script (o GAS, como me gusta acortarlo) suelo repetir insistentemente que es algo así como el "pegamento" que une los distintos servicios de Google Workspace. Usando GAS podemos automatizar procesos en los que intervienen distintas aplicaciones, haciéndolas funcionar de manera integrada y organizada para alcanzar un objetivo específico.

GAS, el pegamento de Google Workspace.

eMayordomo es un ejemplo de ello en la medida en que se trata de un pequeño desarrollo GAS que:

  • Opera sobre un buzón de Gmail.
  • Se configura utilizando una hoja de cálculo de Google.
  • Vuelca un registro de su actividad en esa misma hoja de cálculo.
  • Funciona de manera desatendida.

Pero antes de entrar en materia, te cuento de qué va todo esto para que decidas si te quedas conmigo en este artículo dividido en dos partes: esta que tienes frente a ti y un análisis técnico con mayor profundidad en el repositorio GitHub del proyecto que enlazaré más abajo.

TL;DR

Este artículo presenta eMayordomo, un desarrollo GAS capaz de vigilar un buzón de Gmail y responder automáticamente y de manera condicionada a los correos electrónicos procedentes de diversos formularios web, enviando mensajes preparados de antemano. Estas respuestas preparadas soportan HTML,  imágenes en línea, archivos adjuntos y emojis.

Tabla de contenidos

El problema a resolver

Tal vez estés pensando que eMayordomo resuelve un problema que no existe.

Al fin y al cabo, Gmail ya dispone de la capacidad de responder a ciertos mensajes recibidos utilizando sus reglas para filtrar correos, ¿verdad?

Por ejemplo, esta bonita regla responde con la plantilla Test respuesta automática a todos los correos recibidos en el buzón para la dirección:

audiotraininglead+consulta@agilcentros.es

Sí, se usa el consabido sufijo mágico +loquesea para diferenciar aquellos correos electrónicos a los que deseamos responder con una respuesta preparada, utilizando para ello la dirección a la que se han enviado en primera instancia.

Definiendo una regla de respuesta automática en Gmail.

Podríamos haber incluido en la definición de esta regla otras condiciones, por ejemplo que solo sean respondidos los correos procedentes de una determinada dirección, por supuesto.

¿Problema resuelto? Pues resulta que no siempre.

Veamos, si escribimos a audiotraininglead+consulta@agilcentros.es aparentemente todo funciona bien.

¡Las respuestas automáticas con plantilla a emails convencionales funcionan correctamente!

Miel sobre hojuelas, ¿verdad? Espera un momento.

Supongamos ahora que los mensajes a los que deseamos aplicar esta sencilla regla de respuesta automática proceden de uno de esos habituales formularios web de contacto. Por ejemplo uno tal que este, creado con ese maravilloso editor de páginas web que es Carrd (si no lo conoces, ya tardas).

Formulario web de contacto construido con Carrd.

Siguiendo con las suposiciones, un tal David Petta  (david@petta.com) nos escribe con entusiasmo a través del formulario de contacto interesándose por un también supuesto curso de creación de bandas sonoras. Fíjate en a quién ha respondido nuestra obediente regla:

¿Quién diablos es 01000179ec..000000@amazonses.com y qué ha hecho con David Petta?

Hurguemos en el mensaje que nos ha enviado David con el comando Mostrar original del menú contextual para ver si entendemos qué está pasando aquí:

Delivered-To: audiotraininglead+consulta@agilcentros.es
... ... ...
Return-Path: <01000179ec79f161-63e8e803-b2e7-435a-85eb-0de8fb5e6e24-000000@amazonses.com>
... ... ...
Date: Tue, 8 Jun 2021 16:34:45 +0000 To: audiotraininglead+consulta@agilcentros.es Subject: [Audio Training Test] Bandas sonoras Content-type: text/plain; charset=utf-8 From: David Petta <noreply@carrd.co> Reply-To: David Petta <david@petta.com> Message-ID: <01000179ec79f161-63e8e803-b2e7-435a-85eb-0de8fb5e6e24-
... ... ...
Name: David Petta Email: david@petta.com -------- ¡Quiero ser como Howard Shore!

A ver, así a vuelapluma:

  1. Esta notificación ha sido enviada desde noreply@carrd.co. Pero (obviamente) ahí no hay que responder dado que se trata de la dirección genérica que utiliza la pasarela de envío de correo electrónico de Carrd.
  2. El mensaje incluye un campo Reply-To, hermosísimo él, con la dirección de contacto que ha indicado nuestro querido David al rellenar el formulario. Pero la regla de respuesta automática de Gmail se la pasa por el forro.
  3. En cambio, nuestra sorprendente y muy ingenua regla decide extraer del esotérico Return-Path la dirección de correo electrónico a la que enviar su respuesta enlatada.

Ni que decir tiene que David nunca recibió el correo con esa información que esperaba con anhelo. Una lástima. Y probablemente un cliente menos.

☝ En un sorprendente giro argumental, si decidimos responder manualmente a David resulta que entonces Gmail sí utilizará, como hubiera sido deseable, la dirección de correo electrónico que indica el Reply-To. Pero se trata, claro está, de automatizar, así que esto a mí no me vale. Supongo que a ti tampoco.

Al responder manualmente sí se utiliza como dirección del destinatario la de "responder a".

Pues este es el problema que pretende resolver eMayordomo. Un problema probablemente derivado de un error de lo más tontorrón en el motor de reglas de correo de Gmail, que tal vez se resuelva en cualquier momento.

Pero no podemos confiar en que Google venga a sacarnos las castañas del fuego, así que vamos a solventarlo por nuestra cuenta... a todo GAS 💨.

Objetivos de diseño

Resolver correctamente el problema equivocado es ¿casi? tan decepcionante como solucionar equivocadamente el problema correcto.

Necesitamos objetivos de diseño concretos. Acordemos por tanto de antemano cuál debería ser el alcance de la solución buscada. 

Especificaciones de eMayordomo:

  1. eMayordomo debe vigilar un buzón de Gmail dado e identificar aquellos correos electrónicos que deban ser respondidos.
  2. eMayordomo debe escoger la plantilla de respuesta adecuada atendiendo a ciertas características de los correos electrónicos recibidos tales como su origen, asunto o destinatario. Esta plantilla debe poder confeccionarse utilizando formato HTML, imágenes en línea (incrustadas dentro del mensaje), archivos adjuntos y simpáticos emojis.
  3. eMayordomo debe ser capaz de extraer correctamente la dirección de correo electrónico de la persona a la que se ha de responder, incluso utilizando en su caso expresiones regulares parametrizables sobre el cuerpo del mensaje para recuperar el contenido de los típicos campos de formulario web.
  4. eMayordomo debe poder ser configurado y utilizado por alguien que no sepa ni papa de GAS.
  5. eMayordomo debe rendir cuentas, registrando los eventos ante los que reacciona,  las acciones que realiza y el resultado de las mismas de modo que su funcionamiento pueda ser auditado cómodamente por un operador humano para detectar problemas o extraer estadísticas de uso. Este aspecto es crítico, dado que el script funcionará normalmente en segundo plano, de modo desatendido, y no puede emitir mensajes de error a través de la interfaz de usuario de modo interactivo.

Y este es un breve adelanto de lo que ha salido.

Un vistazo a eMayordomo.

Cómo funciona eMayordomo

A la hora de diseñar eMayordomo pensé inicialmente en incorporar un sistema de reglas propio que permitiera, primeramente, identificar y clasificar los mensajes recibidos en función de algunas de sus características específicas, para a continuación seleccionar y enviar la respuesta automática correspondiente.

Afortunadamente me di cuenta casi inmediatamente de que la primera parte de ese proceso ya estaba resuelta — y muy bien resuelta — precisamente por las propias reglas de filtrado de Gmail. ¿Por qué no utilizarlas hasta donde fuese posible? Y es que no hay necesidad de reinventar la rueda.

Por esa razón, la estrategia de eMayordomo es la que paso a describir. Acompañaré cada paso con una captura tomada de un ejemplo de uso para que te resulte más fácil entender cómo utilizarlo.

  1. El usuario define en su buzón de Gmail una serie de filtros de correo que aplicarán una etiqueta (específica, diferenciada) a cada conjunto de notificaciones a las que deba responderse con un mensaje preparado determinado. De este modo los mensajes entrantes quedarán segmentados. Estas reglas marcarán además los mensajes como destacados (⭐) para indicar que aún no han sido respondidos. En mi ejemplo, aquí abajo, tengo cinco formularios web distintos. Para diferenciar las notificaciones procedentes de cada uno de ellos me he servido del truco que mencionaba al comienzo del artículo para crear cinco alias de la dirección de correo principal mediante el uso del símbolo "+" (+gen, +bs, +dj, +is, +pm). Como es de esperar, he configurado los formularios web para que envíen las respuestas al alias de la dirección que corresponda en cada caso.
    [Ejemplo] Reglas de etiquetado de mensajes. Conviene añadir una acción que impida la clasificación como spam.
  2. El usuario crea de antemano un mensaje en borrador para atender a cada uno de los grupos de mensajes etiquetados por medio de las reglas de filtrado anteriores. Cinco etiquetas, cinco borradores. El asunto de estos borradores debe contener cierto prefijo, seguido de un espacio (" "). Estos prefijos se emplearán posteriormente para asociar cada una de las respuesta - tipo a una etiqueta de manera unívoca. Yo he optado por utilizar una palabra clave, necesariamente entre corchetes, por ejemplo "[ATGEN]". Esta secuencia identificativa (prefijo + espacio) será eliminada del asunto del mensaje al responder, lógicamente.
    [Ejemplo] Borradores para las respuestas preparadas.
  3. Las asociaciones etiqueta (mensaje) borrador se establecen utilizando una tabla de correspondencias en una hoja de cálculo de Google (benditas ellas). Cada fila en la hoja 🔀 Reglas representa una de estas asociaciones. Las ☑️ casillas de verificación permiten indicarle a eMayordomo que ignore temporalmente alguna de las reglas de emparejamiento, sin necesidad de eliminarlas. Cuidado: los prefijos en las celdas de la columna C deben escribirse sin el espacio posterior.
    [Ejemplo] Emparejando etiquetas y mensajes en borrador.
  4. En esta tabla el usuario puede indicar para cada par (etiqueta, prefijo del asunto del borrador) una expresión regular que permita eventualmente extraer del cuerpo del mensaje la dirección de email a la que responder. En las capturas de muestra verás que se utiliza la expresión regular Email: (.+), que busca en el cuerpo del mensaje la cadena de texto "Email: " y se queda con todo lo que encuentra a continuación, hasta el fin de línea. Si esta expresión regular no ha sido especificada en la tabla o el resultado de su aplicación sobre el contenido de un mensaje concreto no es algo que tenga pinta de ser una dirección de correo electrónico (ya sabes, arrobas, puntos, etc.), eMayordomo tratará diligentemente de responder empleando en su lugar los campos  Reply-To o From, por este orden. Y otro detalle, aunque ciertamente accesorio: Si el nombre de la hoja de cálculo finaliza con una secuencia de texto entre paréntesis "(...)", el texto en su interior se utilizará como nombre del remitente al enviar las respuestas. En caso contrario se usará lo que queda a la izquierda de la @ en la dirección de email del propietario del buzón de correo supervisado.
    [Ejemplo] Expresiones regulares (opcionales) para la extracción del email del remitente real.
  5. Periódicamente (cada hora en la versión actual de eMayordomo), se revisan los mensajes etiquetados y destacados ⭐ recibidos y se responde a ellos con el borrador correspondiente. Además, los mensajes se marcan como leídos y no destacados. Para que este proceso en segundo plano tenga lugar es necesario que el propietario de la hoja de cálculo, que también debe ser el dueño del buzón de correo de Gmail donde se han definido reglas, etiquetas y borradores, lo haya activado previamente. También se dispone de la posibilidad de procesar los correos recibidos manualmente, aunque este no debería ser el modo de funcionamiento habitual.
    [Ejemplo] Menú de control de eMayordomo.
  6. Todas las operaciones realizadas, así como los posibles errores que se hubieran podido producir, quedan reflejados en la hoja 🗒️ Registro,  que dispone de unos convenientes controles de filtro para facilitar su inspección y diagnóstico.
    [Ejemplo] Registro de ejecución.
  7. Por último, verás que en la hoja 🔀 Reglas se irán actualizando automáticamente una serie de métricas generales de funcionamiento correspondientes a cada una de las reglas etiqueta /  plantilla: recuento de respuestas enviadas y errores registrados y fecha y hora más reciente en cada caso.
    [Ejemplo] Métricas de actividad.

Monitorizando eMayordomo

Lo bueno que tienen los scripts que utilizan una hoja de cálculo para anotar sus estados y eventos de funcionamiento es que resulta muy fácil, casi irresistible, llevar todo esto a un panel de Data Studio para ponerles las cosas más fáciles a la persona o personas responsables de asegurarse de que el proceso subyacente está funcionando como debe.

Por esa razón he montado también un panel de mando alimentado por los datos de la hoja 🗒️ Registro, de manera que sea aún más fácil y cómodo hacer un seguimiento de la actividad del script mientras él anda a lo suyo.

El panel que te presento a continuación monitoriza concretamente el funcionamiento de una instancia de eMayordomo que he utilizado en mi centro para atender los formularios del sitio web de un proyecto formativo que hemos lanzado recientemente (los datos son de prueba). De hecho fue precisamente la puesta en marcha de este proyecto formativo en el ámbito del audio digital profesional, Audio Training, el que motivó la creación de este script.

Un panel de mando preparado con Data Studio para monitorizar el funcionamiento de eMayordomo.

Seguramente querrás adaptar este panel a tu propio caso de uso, así que te lo facilito también, a modo de plantilla, para que puedas hacerte una copia y personalizarla de acuerdo con tus necesidades y preferencias.

Este informe utiliza un par de trucos (bueno, esencialmente es el mismo) para mostrar la fecha y hora de la actividad más reciente de eMayordomo y hacer que aparezca una leyenda dinámica en la serie temporal de la pestaña Evolución, leyenda que cambia en función del filtro aplicado en el gráfico de columnas o simplemente desparece cuando se están visualizando todos los datos sin filtrar.

Pero esa es otra historia y tal vez sea contada en otra ocasión.

Limitaciones, siguientes pasos y detalles técnicos

De entrada, eMayordomo, como todos los desarrollos GAS que utilizan las API de Google para enviar correos electrónicos, está limitado a un número máximo de envíos diarios: 100 en el caso de cuentas personales y 1.500 cuando el script corre bajo una cuenta corporativa de Google Workspace (2.000 dentro del mismo dominio).

Límites diarios de envío de correos electrónicos (fuente: Quotas for Google Services).

Si esto supone un problema para ti quizás deberías plantearte recurrir a algún servicio comercial, más escalable, como por ejemplo Postmark, que de hecho me ha recomendado mi compañero GDE Riël Notermans (gracias).

También me gustaría aclarar que eMayordomo, en su estado actual, no admite la personalización de los mensajes de respuesta utilizando información tomada de las notificaciones recibidas, así que nada de "Hola, fulano, has pedido información sobre tal o cual cosa.".

Solo respuestas genéricas enlatadas pues, pero diferenciadas. eMayordomo no realiza por tanto un proceso típico de fusión de correo (o mejor, de combinación de correspondencia, expresión más apropiada en castellano que esa traducción directa, un tanto infame, de mail merging). Aunque bien pensado no resultaría especialmente complicado que lo hiciera.

Otra decisión de diseño ha sido establecer la periodicidad con la que eMayordomo se ejecuta de manera desatendida de modo que despierte cada hora, a piñón fijo, para comprobar si hay nuevos correos electrónicos que atender. Esto quiere decir que el tiempo medio de respuesta para los mensajes recibidos será de unos 30 minutos, un intervalo lo suficientemente alineado, en mi opinión, con las expectativas del usuario cuando rellena un formulario web.

Si prefieres incrementar la frecuencia con la que se vigila el buzón debes saber que los activadores por tiempo GAS pueden correr incluso cada minuto (algo generalmente muy excesivo), pero ten en cuenta que Google también establece limitaciones diarias por lo que hace al tiempo de ejecución de estos procesos en segundo plano.

Finalmente, si decides embarcarte en la modificación del código de eMayordomo, por alguna de las razones anteriores o por cualquier otra, tal vez te resulten de interés los detalles técnicos del script que encontrarás en este repositorio en GitHub. Además del código, claro está.

https://github.com/pfelipm/emayordormo

La plantilla de hoja de cálculo y el script

Aquí tienes la hoja de cálculo con datos de prueba utilizada en en el informe Data Studio de ejemplo que te he mostrado:

👉 Mayordomo de email (Test Audio Training) 👈

Y esta es la plantilla de eMayordomo, limpia de polvo y paja, lista para ser utilizada ya en tus historietas:

👉 Mayordomo de email (Plantilla) 👈

Espero que ambas te resulten de utilidad.


Créditos: La imagen de cabecera utiliza una foto de Volodymyr Hryshchenko tomada de Unsplash.

Comentarios