Product
Cómo cumple Kanban2go con la ley de Zawinski
Este artículo de blog de un cliente ha sido escrito por Damon Cali. Damon es el propietario de Ninth Yard, creadores de TrackJumper, una sencilla aplicación web para el seguimiento de errores. También es el desarrollador web principal de kanban2go.

Todo programa intenta expandirse hasta que puede leer emails. Aquellos programas que no logran expandirse así son sustituidos por otros que sí pueden.
Ley de Zawinski
No sé si será verdad, pero kanban2go hace poco dio un paso en esa dirección al incorporar una función basada en email. Lo primero que resulta obvio desde el principio es que escribir una aplicación web que pueda recibir emails es difícil. Hay muchos elementos en movimiento, y algunos de ellos son grandes proyectos en sí mismos.
El usuario envía un mensaje de email y tienes que recibirlo y procesarlo de alguna manera. ¿Cómo se hace? ¿Quieres mantener tu propio servidor de email? ¿Debes configurar buzones para todos tus usuarios? ¿Y qué pasa con el spam y la entregabilidad? Es suficiente para que el equipo de desarrollo se pregunte si vale la pena.
Encontrar una forma más fácil de que los usuarios creen tareas
Esto es lo que me pasaba por la cabeza cuando creamos el buzón de tareas de kanban2go. Pero antes, un poco de contexto. kanban2go es una aplicación de gestión de tareas diseñada en torno a los principios del kanban. Cada usuario tiene uno o más tableros kanban virtuales, en los que hay varias “tareas” virtuales. Inicias sesión, haces clic en “Add Task” y aparece una tarea en el tablero que puedes editar, arrastrar y con la que puedes interactuar.
Queríamos mejorar la experiencia ofreciendo a los usuarios una forma de enviar tareas por email a su cuenta, en lugar de tener que iniciar sesión en la aplicación. Ahí fue cuando la cabeza me empezó a dar vueltas, lo que suele ser un buen indicador de que es el momento de ver si alguien más ha resuelto el problema.
Los buenos artistas toman prestado. Los grandes artistas roban. En este caso, los artistas pragmáticos alquilan. Por suerte, Mailgun facilita todo este proceso. En este artículo voy a exponer cómo abordamos el problema, con la esperanza de que funcione como disparador de algunas ideas para tu propia aplicación. El código que mostramos aquí no es exactamente el que usamos (es una versión simplificada), pero las diferencias tienen más que ver con kanban2go que con Mailgun.
Paso 1: Configurar tu dominio
El primer paso (después de registrarte en Mailgun) es crear y configurar tu dominio en Mailgun.
Nosotros elegimos usar taskbox.kanban2go.com. De este modo, un usuario puede enviar un mensaje a user_abc123@taskbox.kanban2go.com (por ejemplo) y hacer que el mensaje aparezca en su buzón de tareas como una tarea de kanban2go.
La configuración del dominio consiste, básicamente, en configurar los registros DNS de tu dominio según las indicaciones de Mailgun y seleccionar las opciones que quieras en el panel de control. Las instrucciones detalladas para los ajustes de DNS se encuentran en el panel de control de Mailgun. Solo tienes que seguirlas.

En cuanto a las opciones, decidimos activar el filtro de spam para bloquear todo el spam entrante (también podrías conservar el spam, pero preferimos simplificar las cosas). Dado que solo necesitábamos un subdominio, nos decantamos por un dominio normal en lugar de un dominio comodín.

Y eso es todo en cuanto a la configuración del dominio.
Paso 2: Configurar las rutas para el reenvío de emails
Gran parte de la sencillez de Mailgun se debe a su sistema de enrutamiento. Puedes configurar rutas para indicar a Mailgun qué hacer con los mensajes que recibe en el dominio que has configurado. En nuestro caso, no podía ser más sencillo: queríamos que Mailgun reenviara todos los mensajes enviados a *@taskbox.kanban2go.com a una URL de nuestra aplicación: http://kanban2go.com/mailgun/receive. La acción en esa URL procesará el mensaje entrante de forma adecuada.
Lo mejor de las rutas es que admiten expresiones regulares e incluso capturas con nombre que se transmiten a las acciones, por lo que ofrecen muchísima flexibilidad.
Las rutas se configuran en la pestaña de Rutas del panel de control de Mailgun.
En primer lugar, creamos una expresión de filtro, que puedes ver como una expresión regular para Mailgun. En nuestro caso queremos que coincida con cada mensaje enviado a nuestro dominio.
match_recipient('.*@taskbox.kanban2go.com') A continuación, definimos una acción que indica a Mailgun qué debe hacer cuando encuentra una coincidencia.
forward("http://kanban2go.com/mailgun/receive"), stop()
En este caso, reenviamos el mensaje a nuestra aplicación y luego nos detenemos.
Mailgun analizará los mensajes por ti para proporcionarte algunas funciones prácticas, o bien puedes elegir recibir el mensaje sin procesar. Como no estamos haciendo nada complejo y nos ahorra algo de trabajo, optamos por recibir los mensajes ya analizados por Mailgun.
Aquí es donde ocurre gran parte de la magia. Cuando Mailgun recibe un mensaje coincidente, lo procesa y envía una solicitud POST a la URL indicada en la ruta de Mailgun. Los parámetros de esa solicitud incluyen el remitente, el asunto, el cuerpo del mensaje y muchas otras cosas útiles. Consulta la documentación para obtener más información sobre las rutas.
Paso 3: Recibir emails con Rails
Ahora que Mailgun nos envía solicitudes POST, tenemos que configurar nuestra aplicación Rails para gestionarlas.
En kanban2go, un usuario tiene muchas tareas. Cada tarea tiene un atributo llamado “content” que incluye el texto de la tarea.
En nuestra aplicación Rails, tenemos que gestionar las solicitudes POST de Mailgun en http://kanban2go.com/mailgun/receive. El primer paso es crear una ruta para nuestra nueva acción en routes.rb.
post '/mailgun/receive' => 'mailgun#receive' A continuación, tenemos que crear un MailgunController con una acción “receive” en mailgun_controller.rb.
class MailgunController < ApplicationControllerrn protect_from_forgery :except => [:receive]rn def receivern user = User.find_by_taskbox_address(params['recipient'])rn stripped_text = params['stripped-text']rn if userrn Task.create(:user => user, :content => stripped_text)rn endrn render :nothing => truern endrnend
Ten en cuenta que debemos desactivar la protección contra falsificaciones para la acción receive. Para obtener más información sobre el funcionamiento de protect_from_forgery, hay una excelente explicación en la Guía de seguridad de Rails.
Lo primero que hay que hacer en la acción receive es recuperar al usuario al que se envió el mensaje. Para ello, asignamos a cada usuario una única dirección de email para el buzón de tareas (en un atributo “taskbox_address”) al crear su perfil por primera vez. Por ejemplo, un taskbox_address podría ser “hard_to_guess74623@taskbox.kanban2go.com”. Lo importante es que el nombre de usuario de la dirección debe ser único y difícil de adivinar. A continuación, buscamos al usuario con el método User.find_by_taskbox_address (Mailgun lo envía como parámetro ‘recipient’).
Después extraemos el parámetro “stripped-text” de la solicitud. Esto es algo que Mailgun proporciona cuando analiza un mensaje de email. El “stripped-text” es simplemente el cuerpo del email sin ninguna parte citada ni firma.
Si encontramos a un usuario, creamos una tarea que le pertenezca y establecemos el texto extraído como contenido de dicha tarea. Si no encontramos ningún usuario, no ocurre nada.
Paso 4: Relajarse
Y eso es todo. Eso es todo lo que hace falta para convertir emails en tareas con Mailgun. Por supuesto, este es un ejemplo muy sencillo. En función de tus necesidades de seguridad y privacidad, es posible que tengas que realizar comprobaciones y lógica adicionales en tu aplicación, pero Mailgun ya se encarga del trabajo duro: el enrutamiento, el análisis y el filtro de spam.
Espero que esto ayude a aclarar por qué ya no tienes que temerle al uso del email en tu aplicación. Hay todo un mundo de posibilidades, solo tienes que usar la creatividad.
¿Estás pensando en incorporar la gestión de emails en tu aplicación? ¿Qué opinas del enfoque que hemos descrito aquí? Deja tu opinión en los comentarios del blog o únete a la conversación en HackerNews.
Aviso legal: el fundador de kanban2go.com, Prabhakar Gopalan, trabaja en Rackspace, la empresa matriz de Mailgun. kanban2go.com es anterior al trabajo de Prabhakar en Rackspace.