Advertisement
  1. Code
  2. Mailgun
Code

Usando el Mailgun Store(): Un buzón temporal para tu aplicación de correo electrónico entrante.

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup With PHP: Scheduling Availability and Choices
Building Your Startup: Delivering the Meeting Invitation
Sponsored Content

This sponsored post features a product relevant to our readers while meeting our editorial guidelines for being objective and educational.

Spanish (Español) translation by David Castrillón (you can also view the original English article)

Final product image
What You'll Be Creating

Bienvenidos a un episodio especial de nuestra serie Construyendo tu Startup patrocinado por Mailgun. En esta serie, te estoy guiando a través del lanzamiento de una startup desde el concepto a la realidad utilizando mi aplicación Meeting Planner como un ejemplo de la vida real. A cada paso, a liberaremos el código del Meeting Planner como ejemplo de código abierto del que se puede aprender. En el episodio de hoy, Mailgun intervino para patrocinar un tutorial sobre cómo integré su enrutamiento de mensajes y Store() API para manejar las respuestas de los usuarios.

Por ejemplo, cuando la gente recibe las solicitudes de reunión por parte de otros con Meeting Planner, sólo pueden optar a responder y enviar una nota como harían con una cadena de correos de un correo electrónico típico. Sin embargo, quería procesar automáticamente la respuesta, agregarlo como una nota en la reunión y luego notificarle al destinatario que una actualización está lista para ser vista. Suena complicado, pero uno de los objetivos del Meeting Planner es reducir la ida y vuelta de correos electrónicos entre las personas para planear y consolidar cambios en tiempo real con menos notificaciones.

¿Qué es Mailgun?

Si no estás familiarizado aún con Mailgun, es el motor de automatización de correo electrónico con la confianza de más de 10.000 desarrolladores de sitios web y aplicaciones para el envío, recepción y seguimiento de los mensajes de correo electrónico. Tomando ventaja de la potente API del correo electrónico de Mailgun, los desarrolladores pueden dedicar más tiempo a construir sitios web impresionantes y menos tiempo luchando con los servidores de correo electrónico.

Ofrece una variedad de características para una gestión de correos electrónicos rápidamente y eficiente para tu aplicación:

La API de Mailgun soporta todos los lenguajes más populares, incluyendo PHP, Ruby, Python, C# y Java, y te ofrecen una documentación excelente y bien organizada.

Ha sido una opción para mí en mi en mis actividades de consultoría, startups y tutoriales.

Si quieres seguir el tutorial de hoy y no estás aún familiarizado con Mailgun, puede que desees revisar Explorando Mailgun: El motor de correo electrónico para desarrolladores o Cómo Geogram construye un grupo libre de servicio de Correo Electrónico usando Yii para PHP con MySQL. También puede que desees leer Store(): un buzón temporal para todo tu correo entrante para formación más técnica.

Todo el código para el Meeting Planner está escrito en el framework de Yii2 para PHP. Si deseas más información sobre Yii2, revisa nuestra serie paralela Programación con Yii2 en Envato Tuts +.

Si todavía no has probado Meeting Planner, trata de programar ahora tu primera reunión. Realmente se está acercando y se aproxima al lanzamiento alfa.

Los comentarios son bienvenidos. Si tienes alguna pregunta o sugerencia de temas, por favor envía un comentario. También puedes contactarme en Twitter @reifman.

Y gracias, Mailgun, por patrocinar este episodio de nuestra serie de startups!

Ten en cuenta que, ya que este es un tutorial patrocinado, puede aparecer por delante de nuestros episodios regulares de la serie de Startups. Así que algún código puede aparecer más adelante en los próximos episodios.

Usando Mailgun en Meeting Planner

Ya he hablado sobre usar la entrega de SMTP de Mailgun para los emails salientes en el Meeting Planner, pero ¿qué sobre responder a los mensajes de correo?

Por ejemplo, las invitaciones del Meeting Planner tienen un concepto llamado notas. Las notas son comentarios o mensajes que van y vienen entre los destinatarios. En la actualidad, pueden ser publicados desde la página de la reunión. Aquí hay un ejemplo:

Mailgun Store - Add a Note to a Meeting via the Web Interface

Sin embargo, quería hacer fácil para la gente responder a un correo electrónico sobre una reunión y que su mensaje fácilmente se añada como una nota a la reunión y luego esa actualización, con otras notificaciones de cambios de la reunión del grupo. Por ejemplo, una persona puede aceptar los lugares y los tiempos de su invitación por correo electrónico pero también responder a la invitación directamente desde su aplicación de correo electrónico o correo electrónico en la nube. El organizador de la reunión, recibirá una notificación de actualizaciones en lugar de varias.

Un resumen de cómo vamos a utilizar Mailgun

Aquí está un resumen de lo que vamos a construir hoy:

En primer lugar, todos los correos de agendamiento del Meeting Planner utilizarán una dirección de respuesta para dirigir todo a un buzón de @meetingplanner.io. Asignamos los registros MX de Mailgun para que procese todos los correos entrantes. Con el enrutamiento de Mailgun, podemos pedirle al servicio que le notifique a nuestro servidor cuando lleguen nuevos mensajes. Luego, en el fondo, podemos procesarlos.

Mailgun analiza los mensajes con sus algoritmos expertos así que nosotros no tenemos que hacerlo. De esta manera es fácil para nosotros determinar quién respondió a un mensaje, a que reunión respondieron, y qué nota estuvieron escribiendo en su mensaje. Finalmente, añadiremos la nota a la reunión e informaremos al otro participante.

Sígueme a medida que te muestro cómo se hace esto.

Recepción de correo electrónico entrante en tu dominio

Mailgun Store - Customer quote about Mailgun Parsing by Jonathan Novak Uservoice

Hace un momento configuré los registros MX para el MeetingPlanner.io para filtrar todos los correos entrantes directamente a Mailgun.

Mailgun Store - Infographic Showing Route of Incoming Email to Mailgun MX

Este es un ejemplo de los Registros Mx para Mailgun:

Mailgun Store - Example Mailgun MX Records

Usando la sencilla interfaz de usuario de enrutamiento de Mailgun, configuré el forwarding para los buzones de Jeff y el soporte para las personas interesadas en llegar a mí o a soporte al cliente.

Mailgun Store - Routes for Mailbox Exceptions like Support and Jeff

Las características de enrutamiento de Mailgun también proporcionan las siguientes capacidades:

  • Opcionalmente recibir un mensaje en crudo MIME
  • Todos los mensajes se codifican en UTF-8 automáticamente
  • Filtrado antispam gratis
  • Prueba fácil de webhook extremos
  • Generación de partes de texto de correos sólo-HTML
  • Coincidencia en todos los encabezados de correo electrónico (por ejemplo, sujeto, de:, cc:) y receptores
  • Capacidad para encadenar múltiples filtros para proporcionar sofisticadas expresiones

Una vez que estaba listo para integrar las rutas entrantes para la programación de reuniones, decidí utilizar la API de store() de Mailgun. Mientras que Mailgun puede entregar mensajes de correo electrónico analizados al servidor web en tiempo real, las subida temporales o las fallas propias de tu servicios podrían hacer que pierdas mensajes. Basado en comentarios de los clientes, Mailgun decidió construir la capacidad para almacenar mensajes en su nube y dejar a tu aplicación procesarlos durante un período de tres días.

Aquí Mailgun describe algunos casos posibles en los que un almacenamiento en la nube ayuda a resolver:

En algunos casos, los adjuntos son grandes y provocan que se terminen los tiempos de espera, al intentar enviar los datos a sus servidores. En otros casos, hay un gran volumen de correo electrónico entrante y los clientes preferirían sólo ejecutar una solicitud GET en algún intervalo, en lugar de tener que manejar múltiples POSTs de nosotros. Por último, sirve como redundancia en caso de que se caiga su servicio web y no puedan aceptar nuestros POSTs.

Así que he configurado el enrutamiento de Mailgun para simplemente notificarle al servidor de Meeting Planner que sirva cada vez que reciba un nuevo mensaje. Nota la tercera configuración a continuación:

Mailgun Store - Notification Route Post URL to Our Server

Siempre mensajes de comodín llegan a Meeting Planner, Mailgun los almaecenará (store()) y notificará en http://meetingplanner.io/mailgun-notification/store que existe un mensaje nuevo y luego detendrá el proceso con stop().

Ampliando mi uso de la API con Mailgun nuevamente fue sencillo ya que su documentación es de primera clase. Proporciona soporte para una variedad de idiomas, por ejemplo, Ruby, Python, PHP, Java, C# y Go. Ofrece ejemplos para implementar la funcionalidad de Mailgun a través de sus servicios, tanto si transmitiendo, haciendo seguimiento o enrutando.

Por lo tanto, con Yii2 y su generador de código base automatizado, Gii, había creado migraciones, modelos y controladores para un modelo MailgunNotification.

Almacena una URL de notificación de Mailgun que nosotros podemos buscar más adelante. Por ejemplo:

Aquí está el código que añade notificaciones sin procesar con STATUS_PENDING:

Procesamiento de las notificaciones 

En este escenario, tienes que escribir código de producción para procesar y reaccionar más tarde a las notificaciones y mensajes de notificación de Mailgun. Mailgun proporciona una forma útil de probar tu servidor en la parte inferior de la página de configuración de enrutamiento.

Debido a que los servidores de producción son más difíciles de depurar, tomó un tiempo para que estuviera bien. Así que primero trabajé en los errores.

Mailgun Store - Error as I Develop Mailgun Notification Processing

Pero entonces, en definitiva, tengo trabajando las notificaciones entrantes:

Mailgun Store - A Successful Notification Test

Esencialmente, analicé el message-url y lo almacené en la base de datos:

En este ejemplo, imagina que he respondido a una invitación de reunión de Tom para recordarle traer un libro a nuestra discusión en el café:

Mailgun Store - User scenario as I send an email meeting note

En respuesta, Mailgun nos notifica del mensaje y una dirección de URL segura para acceder a su contenido se almacena en la tabla de MailgunNotification:

Mailgun Store - MailgunNotification Table

Procesamiento de Mensajes en Segundo Plano

A continuación, extendí el procesamiento en segundo plano del Meeting Planner para buscar mensajes nuevos de Mailgun y procesarlos. El análisis del correo electrónico con Mailgun es fácil ya que ha hecho todo el trabajo que de lo contrario llevaría meses (y meses... y meses... y meses).

Esencialmente, Mailgun toma el correo electrónico entrante no estructurado (que se muestra a la izquierda) y envía la aplicación analizada y los datos estructurados (mostrados a la derecha):

Mailgun Store - Infographic of Powerful Mailgun API Parsing

Desarrolladores independientes que están desinformados pasan meses codificando el correo electrónico y analizándolo por su cuenta, una tarea que nunca realmente completa. Mailgun hace esto por ti.

Pasemos por el método MailgunNotification::Process. Al principio, buscamos notificaciones pendientes en la tabla MailgunNotification e invocamos mi componente Yiigun.php que hace una petición get() a Mailgun en la URL que recibimos para una notificación:

Mailgun devuelve los datos detallados del mensaje. De manera que analizamos el meeting_id del campo del destinatario, el cuerpo del texto y el correo electrónico del remitente. Otra vez, Mailgun hace esto fácil:

Especialmente aprecio que Mailgun proporcione texto despojado, el cual toma la firma del remitente y responde a la cadena. También uso HtmlPurifier para evitar el texto sin escape potencialmente dañino dirigido a nuestro servidor.

En este esfuerzo, reaprendí que para acceder a una propiedad con guión de un objeto en PHP, es necesario rodearla con llaves:

Y por último, una vez que hemos determinado que la reunión y el remitente existen y que este último es un asistente, agregamos el stripped_text como una nota:

La nueva nota aparecerá en la página del evento de la Reunión cuando el participante regrese:

Mailgun Store - Meeting Invitation with Note from Email Added Automatically

Yii soporta los eventos de ActiveRecord de manera que cuando una nota es agregada con MeetingNote se crea automáticamente una entrada en MeetingLog:

En un futuro episodio, voy a explicar cómo este evento activará otro que ayuda a Meeting Planner a coordinar  cuándo sea el mejor momento de notificarle a los participantes que se ha producido una nueva nota u otro cambio.

Trata de enviar una invitación de Meeting Planner y pídele a tu receptor que responda el correo con un mensaje. Deberías recibir una notificación poco tiempo después de que lo han hecho y luego poder verlo en la página del evento.

En el Cierre

Espero que hayas disfrutado este vistazo aplicado sobre el uso del enrutamiento de Mailgun y la API de almacenamiento store(). Es una API bastante divertida y sofisticada con la cual trabajar. Mailgun realmente ofrece una amplia gama de servicios de correo electrónico que son relevantes a todas las clases de codificación y desarrollo de negocios. E, impresionantemente, hace un gran trabajo en todo lo que ofrecen.

Sin duda este es un artículo patrocinado, pero como usuario experimentado, ofrezco mi auténtica recomendación para probar el servicio hoy. Yo he estado usándolo para todos mis proyectos.

Y, obviamente, hay un montón de otros escenarios que podríamos construir cuando procesamos mensajes. Por ejemplo, podríamos dejar que los usuarios respondan con comandos tales como "tarde" y sabremos escribirle a la otra personas que su colega llegará tarde.

Por favor, haznos saber sobre qué características de Mailgun te gustaría ver más en el futuro. Puedes publicarlo en los comentarios o contactarme directamente en Twitter @reifman.

Enlaces relacionados

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.