Email

Enrutamiento de emails entrantes en PHP

El envío de emails es, sin duda, la función más conocida por la base de usuarios de Mailgun, pero la plataforma puede hacer mucho más que enviar emails y realizar el seguimiento de las analíticas.
Imagen para Enrutamiento de emails entrantes en PHP

El envío de emails es, sin duda, la función más conocida por la base de usuarios de Mailgun, pero la plataforma puede hacer mucho más que enviar emails y realizar el seguimiento de las analíticas. Cuando me preguntan qué es lo que más me gusta de Mailgun, casi siempre digo lo intuitiva y bien documentada que está la API. Sin embargo, hay una función en particular de la que me gusta hablar a todo el mundo: el sistema de análisis y enrutamiento de emails entrantes, también conocido como «Rutas» en el panel de control.

El enrutamiento de emails entrantes significa que puedes configurar Mailgun para recibir emails en tu nombre. Puedes configurarlo con un dominio completo o con el subdominio que elijas. Creo que usar un subdominio es la mejor opción, ya que solo puedes configurar un servicio para recibir tus emails a la vez.
Esto significa que no puedes utilizar tu cliente de email y la función de emails entrantes de Mailgun en el mismo dominio. Por este motivo, tengo una configuración como la siguiente:

  • orlando@dominio.com: que utilizo con un cliente de email normal.
  • robots@inbound.dominio.com: que gestiona otros flujos de trabajo de emails a través de la API de emails entrantes de Mailgun.

Una vez que se recibe un email, Mailgun puede hacer varias cosas con él: enviarlo a otro punto de conexión que elijas, redirigirlo a otro email o almacenarlo para que puedas procesarlo más tarde.

¡Genial! ¿Para qué lo utilizo?

¡Procesar todos los archivos adjuntos!

¿Y si pudieras usar los emails para crear una aplicación que recibiera archivos adjuntos y los enviara automáticamente a tu cuenta de almacenamiento en la nube (como Dropbox, Google Drive o similar)?

¿Y si este email pudiera entender quién te envía los archivos adjuntos, qué contienen y ordenarlos en consecuencia?

Pues tenemos buenas noticias: ¡con el enrutamiento de emails de Mailgun es posible!

Para ello, debes especificar un filtro en un dominio o subdominio. Para empezar, visita las rutas en el panel de control y recuerda que tendrás que cambiar los ajustes de DNS de tu dominio en consecuencia para que tus registros MX apunten a Mailgun.

Una ruta se compone de un filtro, una acción, una descripción para facilitar a las personas la comprensión de lo que hace la ruta y una prioridad.

Un filtro es de uno de los siguientes tipos:

  • match_recipient(pattern): donde el patrón es una expresión regular de una dirección de email.
  • match_header(header, pattern): donde el encabezado es un (encabezado MIME) y el patrón una expresión regular.
  • catch_all(): normalmente tiene la prioridad más baja, ya que reenviará cualquier email entrante.

Puedes especificar el filtro anterior para que tenga acciones de forma dinámica; si el filtro coincide con una dirección especificada, se producirá la acción resultante. A continuación encontrarás una lista de acciones; ten en cuenta que puedes tener más de una acción en un momento dado:

  • Forward(): reenvía el email a otra dirección de email o URL.
  • Store(): guarda el email coincidente en el servidor de Mailgun hasta 3 días para su uso posterior o retrasado.
  • Stop(): simplemente detiene la cadena de acciones. Es necesario para evitar que otras acciones sigan procesando el mensaje. (Lo veremos con más detalle más adelante).

Prioriza las rutas dándoles la prioridad correspondiente.

  • Número bajo = Prioridad alta
  • Número alto = Prioridad baja

Las rutas con la misma prioridad reciben su prioridad según la fecha de creación.

Tras configurar el DNS de tu dominio o subdominio para reenviar emails a Mailgun, tal como se explica en la documentación con los ajustes indicados en la página de tu dominio, ¡ya puedes empezar con la parte divertida!

Creación, edición y eliminación de rutas en PHP

Después de instalar la biblioteca de PHP, podemos crear un nuevo archivo llamado createRoutes.php.

                                

                                    post("routes", array(
    'priority'    => $CONST_PRIORITY,
    'expression'  => 'match_recipient("'. $CONST_RECIPIENTEXP.'")',
    'action'      => array('forward("'.$CONST_FORWARDTO.'")', 'stop()'),
    'description' => $CONST_DESCRIPTION
));
?>
                                
                            

¿Qué tal si enumeras todas las rutas para investigar cuáles has creado ya, de forma programática, y poder editarlas en el futuro?

                                

                                    get(
"routes", array('skip' => 0, 'limit' => 10)
);
#Let's print some output, ofcourse you can iterate the object $result to find more information regarding the routes!
print "<strong>The whole object:</strong>"; 
print "<br>";
print_r($result);
print "<br>";
print "<strong>The expression assigned to the first route:</strong>"; 
print "<br>";
print $result->http_response_body->items[0]->expression;
print "<br>";

?>
                                
                            

Llegados a este punto, hemos creado una ruta correctamente.
Cada vez que Mailgun recibe un email de la dirección *@sampleprovider.com, Mailgun tomará el mensaje y enviará un webhook con su contenido a http://samplewebsite.com/webhook.

Ahora por mi parte (suponiendo que http://samplewebsite.com/webhook sea mi servidor), quiero capturar el contenido del webhook que se ha enviado cuando un filtro detecta un email entrante.

Mailgun envía todo tipo de encabezados; la mayoría se enumeran a continuación:

                                

                                    Content-Type    
Date    
From    
In-Reply-To    
Message-Id    
Mime-Version    
Received    
References    
Subject    
To    
X-Envelope-From    
X-Mailgun-Incoming    
X-Received    
body-html    
body-plain    
domain    
from    
message-headers    
message-url    
recipient    
sender    
signature    
stripped-html    
stripped-signature    
stripped-text    
subject    
timestamp    
token 
                                
                            

Supongamos que queremos escribir en un archivo el cuerpo del mensaje sin HTML, saltos de línea ni retornos de carro.

El siguiente código será ejecutado por PHP cuando se reciba el webhook enviado por Mailgun, y escribirá el contenido del cuerpo de la solicitud (en este caso elegí stripped-text, pero podría haber sido cualquiera de los anteriores) en un archivo llamado output.txt.

                                

                                    
                                
                            

Como puedes ver, ¡las opciones a partir de aquí son infinitas!

Si te interesa obtener más información sobre las funciones de enrutamiento de emails entrantes, dirígete a la página de documentación o no dudes en hacer preguntas o comentar por aquí o en Twitter.

¡Feliz envío!