Bienvenido a un episodio especial de nuestra serie Construyendo su inicio patrocinada por Mailgun. En esta serie, lo guío a través del lanzamiento de una puesta en marcha del concepto a la realidad utilizando mi aplicación Meeting Planner como un ejemplo de la vida real. En cada paso del camino, lanzaremos el código del organizador de reuniones como ejemplos de código abierto de los que puede aprender. En el episodio de hoy, Mailgun intervino para patrocinar un tutorial sobre cómo integré su enrutamiento de mensajes y la API Store () para manejar las respuestas de los usuarios..
Por ejemplo, cuando las personas reciben convocatorias de reunión de otras personas con Meeting Planner, pueden elegir responder y enviar una nota como lo harían a un hilo de correo electrónico típico. Sin embargo, quería procesar automáticamente la respuesta, agregarla como una nota a la reunión y luego notificar al destinatario que hay una actualización lista para ver. Suena complicado, pero uno de los objetivos de Meeting Planner es reducir los correos electrónicos de ida y vuelta entre las personas sobre la planificación y consolidar los cambios en tiempo real en menos notificaciones..
Si aún no está familiarizado con Mailgun, es el motor de automatización de correo electrónico en el que confían más de 10.000 desarrolladores de sitios web y aplicaciones para enviar, recibir y rastrear correos electrónicos. Al aprovechar las poderosas API de correo electrónico de Mailgun, los desarrolladores pueden dedicar más tiempo a crear sitios web increíbles y menos tiempo a luchar con los servidores de correo electrónico..
Ofrece una variedad de funciones para administrar el correo electrónico de forma rápida y eficiente para su aplicación:
La API de Mailgun es compatible con todos los lenguajes más populares, incluidos PHP, Ruby, Python, C # y Java, y ofrecen una documentación excelente y bien organizada..
Ha sido una opción para mí en muchas de mis actividades de consultoría, startups y tutoriales..
Si desea seguir el tutorial de hoy y aún no está familiarizado con Mailgun, puede consultar Explorando Mailgun: El motor de correo electrónico para desarrolladores o Cómo Geogram creó un servicio gratuito de correo electrónico grupal con Yii para PHP con MySQL. También es posible que desee leer Store (): un buzón temporal para todos sus correos electrónicos entrantes para obtener más antecedentes técnicos.
Todo el código de Meeting Planner está escrito en el Framework Yii2 para PHP. Si desea obtener más información sobre Yii2, consulte nuestra serie paralela Programming With Yii2 en Envato Tuts+.
Si aún no ha probado el Planificador de reuniones, intente programar su primera reunión ahora. Realmente se está uniendo y se acerca el lanzamiento alfa.
La retroalimentación es bienvenida. Si tiene alguna pregunta o sugerencia sobre un tema, por favor envíe un comentario a continuación. También puedes contactarme en Twitter @reifman.
Y gracias, Mailgun, por patrocinar este episodio de nuestra serie de inicio.!
Tenga en cuenta que, debido a que este es un tutorial patrocinado, puede aparecer antes de nuestros episodios habituales de la serie de inicio. Así que algunos códigos pueden aparecer más adelante que en los próximos episodios.
Ya he hablado sobre el uso de la entrega SMTP de Mailgun para los correos electrónicos salientes en el Meeting Planner, pero ¿qué hay de responder a los correos electrónicos??
Por ejemplo, las invitaciones de Meeting Planner tienen un concepto llamado notas. Las notas son comentarios o mensajes compartidos entre destinatarios. Actualmente, se pueden publicar desde la página de vista de la reunión. Aquí hay un ejemplo:
Sin embargo, quería facilitar que las personas respondan a un correo electrónico sobre una reunión y que su mensaje se agregue fácilmente como una nota a la reunión, y luego agrupe esa actualización con otras notificaciones de cambios sobre la reunión. Por ejemplo, una persona puede aceptar lugares y horas de su correo electrónico de invitación, pero también responder a la invitación directamente desde su aplicación de correo electrónico o correo electrónico basado en la nube. El organizador de la reunión recibirá una notificación de actualizaciones en lugar de varias.
Aquí hay un resumen de lo que estamos construyendo hoy:
Primero, todos los correos electrónicos de programación del Planificador de reuniones usarán una dirección de respuesta para dirigir todo a un buzón @ meetingplanner.io. Mailgun está asignado para procesar todos los correos electrónicos entrantes a través de nuestros registros MX. Con el enrutamiento de Mailgun, podemos pedirle al servicio que notifique a nuestro servidor cada vez que llegan nuevos mensajes. Luego, en el fondo, podemos procesarlas..
Mailgun analiza los mensajes con sus algoritmos expertos para que no tengamos que hacerlo. Por lo tanto, es fácil para nosotros determinar quién respondió a un mensaje, a qué reunión respondieron y qué nota escribieron en su mensaje. Finalmente, agregaremos la nota a la reunión e informaremos al otro participante..
Sigue a lo largo de mi camino a través de cómo se hace esto.
Hace un tiempo, configuré registros MX para MeetingPlanner.io para canalizar todo el correo electrónico entrante directamente a Mailgun.
Aquí hay un ejemplo de registros MX para Mailgun:
Usando la sencilla interfaz de usuario de enrutamiento de Mailgun, configuré el reenvío para el correo electrónico y el soporte para que las personas interesadas me contacten o reciban atención al cliente.
Las características de enrutamiento de Mailgun también proporcionan las siguientes capacidades:
Una vez que estuve listo para integrar el enrutamiento de entrada para la programación de reuniones, decidí usar la API de la tienda () de Mailgun. Si bien Mailgun puede enviar correos electrónicos analizados a su servidor web en tiempo real, los aumentos temporales o las fallas de su propio servicio pueden hacer que pierda mensajes. Basándose en los comentarios de los clientes, Mailgun decidió desarrollar la capacidad de almacenar mensajes en su nube y dejar que su aplicación los procesara durante un período de tres días..
Aquí está Mailgun describiendo algunos casos posibles que una tienda en la nube ayuda a resolver:
En algunos casos, los archivos adjuntos son grandes y causan tiempos de espera cuando intentamos enviar los datos a sus servidores. En otros casos, hay un gran volumen de correo electrónico entrante y los clientes prefieren simplemente ejecutar una solicitud GET en algún intervalo en lugar de tener que gestionar varios POST de nosotros. Finalmente, sirve como redundancia en caso de que su servicio web se caiga y no puedan aceptar nuestros POST..
Así que configuré el enrutamiento de Mailgun para simplemente notificar al servidor del Planificador de reuniones cada vez que recibe un nuevo mensaje. Note la tercera configuración a continuación:
Siempre que los mensajes comodín entren en el Planificador de reuniones, Mailgun almacenar() ellos y notificar http://meetingplanner.io/mailgun-notification/store que hay un nuevo mensaje y luego detener() tratamiento.
La expansión de mi uso de la API con Mailgun fue una vez más sencilla, 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 prácticos de implementación de la funcionalidad de Mailgun en sus servicios, ya sea que esté transmitiendo, rastreando o enrutando.
Por lo tanto, utilizando Yii2 y su generador de código de andamio automatizado, Gii, creé migraciones, modelos y controladores para un modelo MailgunNotification.
la clase m160514_010650_create_mailgun_notification_table extiende la migración public function up () $ tableOptions = null; if ($ this-> db-> driverName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% mailgun_notification', ['id' => Schema :: TYPE_PK, 'url' => Schema :: TYPE_STRING. 'NOT NULL', 'status' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Schema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);
Almacena una URL de notificación de Mailgun que podemos recuperar más adelante. Por ejemplo:
https://api.mailgun.net/v2/domains/meetingplanner.io/messages/eyJw2UsICJrIjogImUyQ5LTk1NmItNGIwOCLWZmZTFjMDU3ZiIsICJzIjogIjNGUiLCIiIcy
Aquí está el código que agrega notificaciones sin procesar con ESTADO: PENDIENTE
:
almacén de funciones públicas ($ message_url) // almacenar la url desde la notificación de mailgun $ mn = new MailgunNotification (); $ mn-> status = MailgunNotification :: STATUS_PENDING; $ temp = str_ireplace ('https://api.mailgun.net/v2/', ", $ message_url); $ temp = str_ireplace ('https://api.mailgun.net/v3/',", $ temp ); $ mn-> url = $ temp; $ mn-> guardar ();
En este escenario, debe escribir el código de producción para procesarlo y luego reaccionar a las notificaciones y mensajes que Mailgun le notifica. Mailgun proporciona un formulario de prueba útil para probar su servidor en la parte inferior de su página de configuración de enrutamiento.
Debido a que los servidores de producción son más difíciles de depurar, tomó algo de tiempo para hacerlo bien. Así que me encontré con errores al principio.
Pero luego, en última instancia, recibí las notificaciones entrantes trabajando:
Esencialmente, analicé el mensaje-url
y lo almacenó en la base de datos:
función pública actionStore () // almacena la notificación de entrada entrante desde Mailgun if (isset ($ _ POST ['message-url'])) MailgunNotification :: store ($ _ POST ['message-url']);
En este ejemplo, imagine que he respondido a una invitación a una reunión de Tom para recordarle que traiga un libro a nuestra discusión sobre el café:
En respuesta, Mailgun nos notifica el mensaje, y una URL segura para acceder a su contenido se almacena en el MailgunNotification
mesa:
A continuación, extendí el procesamiento en segundo plano de Meeting Planner para buscar nuevos mensajes de Mailgun y procesarlos. Analizar el correo electrónico con Mailgun es fácil, ya que han hecho todo el trabajo que de otra manera 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 su aplicación analizada, los datos estructurados (que se muestran a la derecha):
Los desarrolladores independientes no informados pasan meses codificando el análisis del correo electrónico por su cuenta, una tarea que nunca está realmente completa. Mailgun maneja esto por ti.
Caminemos por el MailgunNotification :: Proceso
método. Al principio, buscamos notificaciones pendientes en el MailgunNotification
mesa e invocar mi componente Yiigun.php que hace una obtener()
solicitud a Mailgun en la URL que recibimos para una notificación:
proceso de función estática pública () $ items = MailgunNotification :: find () -> where (['status' => MailgunNotification :: STATUS_PENDING]) -> all (); if (count ($ items) == 0) return false; $ yg = nuevo Yiigun (); foreach ($ elementos como $ m) $ error = falso; // echo $ m-> id. '
'; $ raw_response = $ yg-> get ($ m-> url); if (is_null ($ raw_response)) $ m-> status = MailgunNotification :: STATUS_NOT_FOUND; $ m-> update (); continuar; $ response = $ raw_response-> http_response_body;
Mailgun devuelve los datos detallados del mensaje. Así que analizamos el meeting_id
desde el campo del destinatario, el texto del cuerpo y el correo electrónico del remitente. Una vez más, Mailgun hace esto fácil:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text'); // analizar el id de la reunión si (isset ($ response-> To)) $ to_address = $ response-> To; else $ to_address = $ response-> to; $ to_address = str_ireplace ('@ meetingplanner.io', ", $ to_address); $ to_address = str_ireplace ('mp _',", $ to_address); $ meeting_id = intval ($ to_address); if (! is_numeric ($ meeting_id)) $ error = true; $ m-> status = MailgunNotification :: STATUS_INVALID_MEETING_ID; $ m-> update (); continuar; // echo 'mid:'. $ meeting_id. '
'; // verificar que el ID de la reunión es válido si (isset ($ response-> Sender)) $ sender = $ response-> Sender; else $ sender = $ response-> sender; // limpiar remitente // echo 'pre limpiar remitente:'. $ remitente. '
'; $ sender = \ yii \ helpers \ HtmlPurifier :: process ($ sender); // echo 'sender:'. $ sender. '
'; $ user_id = User :: findByEmail ($ sender); if ($ user_id === false) $ error = true; // no hacer nada // hacer - responder con no reconocer la dirección de correo electrónico $ m-> status = MailgunNotification :: STATUS_UNRECOGNIZED_SENDER; $ m-> update (); continuar;
Aprecio especialmente que Mailgun proporcione texto reducido, que elimina la firma del remitente y el hilo de respuesta. Yo tambien uso HtmlPurificador
para evitar que el texto no escapado potencialmente peligroso se dirija a nuestro servidor.
Durante este esfuerzo, volví a aprender que para acceder a una propiedad con guión de un objeto en PHP, necesitas rodearlo con corchetes:
$ stripped_text = \ yii \ helpers \ HtmlPurifier :: process ($ response -> 'stripped-text');
Y finalmente, 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:
// echo 'comprobar asistente'; // verificar que el remitente es un participante u organizador en esta reunión $ is_attendee = Reunión :: isAttendee ($ meeting_id, $ user_id); if ($ is_attendee) // agregar una nota de la reunión, automáticamente se registra y se actualiza la reunión TouchNote :: add ($ meeting_id, $ user_id, $ stripped_text); else
La nueva nota aparecerá en la página del evento Reunión cuando el participante regrese:
Yii admite eventos ActiveRecord para que cuando un ReuniónNota
se agrega un MeetingLog
la entrada se crea automáticamente:
función pública afterSave ($ insert, $ changedAttributes) parent :: afterSave ($ insert, $ changedAttributes); if ($ insert) // if MeetingNote MeetingLog :: add ($ this-> meeting_id, MeetingLog :: ACTION_ADD_NOTE, $ this-> posted_by, $ this-> id);
En un episodio futuro, explicaré cómo este evento activará otro evento que ayude a la Coordinadora de reuniones a coordinar cuándo es mejor notificar a los asistentes a la reunión que se ha producido una nueva nota u otro cambio..
Intente enviar una invitación al organizador de reuniones y pídale a su destinatario que responda al correo electrónico con un mensaje. Debería recibir una notificación poco después de que lo hayan hecho y luego poder verla en la página del evento..
Espero que hayas disfrutado este aspecto aplicado al usar la API de enrutamiento y almacenamiento () de Mailgun. Es una API muy divertida y sofisticada para trabajar. Mailgun realmente ofrece una amplia gama de servicios de correo electrónico que son relevantes para todo tipo de codificación y desarrollo empresarial. Y, impresionantemente, hacen un gran trabajo en todo lo que ofrecen.
Ciertamente, esta es una publicación patrocinada, pero como usuario experimentado, le ofrezco mi recomendación auténtica para que pruebe el servicio hoy. Los he estado utilizando para todos mis proyectos..
Y, obviamente, hay muchos otros escenarios que podríamos construir al procesar mensajes. Por ejemplo, podríamos permitir que los usuarios respondan con comandos como "tarde" y sabremos enviar un mensaje de texto a la otra persona que su colega llega tarde..
Háganos saber qué funciones de Mailgun le gustaría que se escribieran sobre más en el futuro. Puede publicarlos en los comentarios a continuación o contactarme directamente en Twitter @reifman.