Advertisement
  1. Code
  2. Yii

Creando su startup con PHP: Comandos de correo electrónico

by
Read Time:11 minsLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Delivering the Meeting Invitation
Building Your Startup With PHP: Email Commands

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Introducción

Este tutorial forma parte de la serie Creando su startup con PHP en Envato Tuts +. En esta serie, te estoy guiando a través del lanzamiento de un inicio de concepto a realidad utilizando mi aplicación de Meeting Planner como un ejemplo de la vida real. Cada paso a lo largo del camino, voy a lanzar el código de Meeting Planner como ejemplos de código abierto que puede aprender. También me ocuparé de asuntos relacionados con el inicio de negocios a medida que surjan.

¿Qué cubre este episodio?

En el último tutorial, comenzamos a enviar por correo electrónico invitaciones a reuniones que incluían numerosos enlaces para que los participantes respondieran, es decir, ver la página de la reunión, aceptar todos los lugares y horas, rechazar un lugar o una hora, etc.

En este tutorial, revisaré cómo elegí construir y procesar esos vínculos de una manera segura y funcional. La mayoría de los participantes de la reunión (especialmente al principio) no habrán utilizado antes el Planificador de reuniones, nos será desconocido. Sin embargo, queremos autenticarlos de forma segura para permitirles ver e interactuar con la solicitud de reunión y crear su propia para el futuro. También queremos tener algunas salvaguardas para cuando las personas envíen las solicitudes de reunión con sus códigos seguros sin pensar en las ramificaciones (quizás neófitos, o simplemente en la gente común).

Apenas un recordatorio, todo el código para el planificador de la reunión se escribe en el marco de Yii2 para PHP. Si desea obtener más información sobre Yii2, consulte mi serie paralela Programación con Yii2 en Envato Tuts +.

En el momento en que está leyendo esto, probablemente puede comenzar a probar invitaciones de reunión en el sitio web en vivo, MeetingPlanner.io (tenga en cuenta, sigue habiendo un montón de trabajo de mejora de la experiencia del usuario y el pulido para hacer). Participo en los hilos de comentarios de abajo y estoy especialmente interesado si usted tiene ideas adicionales o desea sugerir temas para futuros tutoriales. También puede contactarme en Twitter @reifman.

Comandos del Planificador de reuniones

La Importancia de los Comandos

Durante mi proceso de diseño, pensé en comandos en el correo electrónico como elementos tanto del proceso de planificación de la reunión como del tiempo que conducía al evento real.

Cuando un participante recibe una invitación por correo electrónico, tendrá que ofrecer permisos seguros para ver la página de la reunión, pero también para responder si los lugares y horas específicas funcionan bien para ellos.

Después de finalizar una reunión, podemos comenzar a enviar recordatorios a los participantes que ofrezcan órdenes especializadas como "Estoy llegando tarde", lo que haría un texto a las otras partes de su situación, o "solicitar un cambio de lugar" o "cancelar".

Todos estos comandos necesitan autenticar al destinatario y proporcionarles un acceso seguro al sitio web para que Meeting Planner pueda procesar correctamente sus respuestas. Sin embargo, el sitio también necesita salvaguardar no publicar la lista de contactos completa de un miembro si, por error, envía un correo electrónico de invitación a una otra persona que hace clic en los vínculos. La parte secundaria ingresaría fácilmente en la cuenta del Planificador de reuniones del destinatario y podría ver todas sus reuniones e información personal.

¿Qué órdenes se necesitan?

A medida que pensaba en la visión de la aplicación más aun, hay un gran número de comandos potenciales. Aquí hay algunos en la invitación inicial (que puedo simplificar en algún momento para mejorar la experiencia del usuario):

  • Ver la reunión
  • Aceptar todos los lugares y tiempos
  • Rechazar la invitación
  • Aceptar o rechazar determinados lugares
  • Aceptar o rechazar fechas y horas particulares
  • Finalizar la reunión *
  • Sugerir otro lugar *
  • Sugerir otra fecha y hora *
  • Elige el lugar final *
  • Elija la fecha y la hora finales *
  • Añadir o responder a las notas de la reunión
  • Ver un mapa de la ubicación de los lugares dentro del contexto de la reunión
  • Revise su configuración de correo electrónico
  • Bloquear este organizador de enviarle un correo electrónico
  • Anular la suscripción de todos los correos electrónicos de Meeting Planner

Nota: La aparición de elementos marcados con estrellas (*) depende de la configuración de la reunión del organizador.

Una vez planificada la reunión, también hay una variedad de comandos de seguimiento:

  • Reprogramar la reunión
  • Cancelar la reunión
  • Muéstrame un mapa
  • Obtener indicaciones para llegar
  • Solicitar un cambio a la hora
  • Solicitar un cambio al lugar
  • Notificar a las partes que está llegando tarde

Consideraciones arquitectónicas

Dada la plétora de varios comandos, sentí que sería útil para autenticar y procesar todos ellos de forma idéntica en un solo controlador.

Por ahora, he creado un único punto de procesamiento en MeetingController, pero espero que más adelante crearé un CommandController dedicado. También he considerado la creación de un controlador de acceso API en el futuro y la canalización de toda la funcionalidad de la aplicación a través de este único punto de entrada segura. Por ahora, me quedaré con eso.

Para empezar, le di a cada comando una definición constante específica dentro del modelo Meeting.php:

Creación de los enlaces de comandos

Decidí que, por ahora, cada comando tendrá los siguientes argumentos de URL:

  • $Id para la meeting_Id
  • $cmd para la acción de comando (de las constantes anteriores)
  • $obj_id para cualquier objeto que se pueda actuar sobre, es decir, lugar o fecha, hora
  • $actor_id para el user_id invocando el comando
  • $k para la clave que autentica el $actor_id a su cuenta

La mayoría de los participantes al principio no se han registrado, pero creamos claves de autenticación vinculadas a sus correos electrónicos de invitación cuando se crea la reunión. Así es como autenticamos sus enlaces desde invitaciones por correo electrónico.

Aquí hay un ejemplo de enlace URL incrustado en correos electrónicos:

http://meetingplanner.io/meeting/command?id=27&cmd=70&actor_id=18&k=9cHGl...1x

Dada la complejidad de crear las URL con varios argumentos de muchos lugares en el código, creé una biblioteca /common/components/MiscHelpers.php, que comenzó con buildCommand:

He aquí un ejemplo de nuestro archivo de invitación-html.php que llama a buildCommand() para mostrar filas de lugares. Cada lugar tiene comandos que deben proporcionar todos estos argumentos en URL:

Puedes ver que se ven a continuación:

Meeting Planner Places and Commands for PlacesMeeting Planner Places and Commands for PlacesMeeting Planner Places and Commands for Places

Procesamiento de los comandos

A continuación, construí la función de controlador para autenticar y procesar los comandos. Aquí está la primera parte:

Inicialmente, quería proporcionar salvaguardias para mi propia prueba, así como personas que reenvían mensajes de correo electrónico con sus enlaces de autenticación.

En un evento lo que compruebo es si el $actor_id es un usuario diferente al usuario actualmente conectado. Esto podría suceder durante las pruebas con varias cuentas, o podría ocurrir si el participante envía su invitación al organizador. En última instancia, voy a proporcionar información sobre la situación y ofrecer opciones para las personas. Sin embargo, por ahora, acabo de registrar el usuario actual antes de autenticar al usuario solicitante.

Si el usuario ya ha iniciado sesión como $actor_id, entonces se autenticarán. Si no están autenticados, ejecutamos el chequeo de autenticación:

Utilizamos las funciones incorporadas de findIdentity y validateAuthKey de Yii para esto.

En un futuro próximo, planeo hacer que la autenticación por correo electrónico proporcione un acceso limitado a las funciones de la cuenta. Por ejemplo, siempre que los usuarios no estén conectados pero hagan clic en vínculos de comandos, restringiremos sus actividades únicamente a esa reunión y algunas características relacionadas. No podrán ver otras reuniones, los amigos del titular de la cuenta, etc. Sin embargo, ofreceremos un vínculo amistoso para que se inicien en su cuenta a través de una contraseña o un inicio de sesión social. Esto minimizará los impactos de seguridad de las personas que envían las invitaciones alrededor.

Del mismo modo, si un nuevo usuario que nunca se ha registrado antes hace clic en un vínculo de comando, presentaremos recordatorios para que se registren y creen una contraseña o un inicio de sesión social. El modelo User.php tiene campos de estado que indican si un usuario se ha registrado alguna vez, o si fueron invitados pasivamente a una reunión.

Por ahora, si la autenticación tiene éxito, podemos procesar cada uno de los comandos:

Para funciones que todavía no he creado, he creado una vista para indicar que la característica no está disponible, ej. /views/site/unavailable.php, o si el comando es malentendido, entonces /views/site/error.php.

Dos comandos de ejemplo

Veamos dos comandos de ejemplo. Primero, miremos que sugiere otro lugar:

En este caso, la funcionalidad requiere que el usuario regrese a nuestro sitio web para rellenar un formulario donde puedan seleccionar un nuevo lugar. Así que, solo los redirigimos a la página de creación de la página de reunión de ese meeting_id. Y ya están autenticados y conectados desde arriba.

He aquí un ejemplo de esto—observe que el menú de migas de pan refleja el contexto de la reunión, p. Desayuno Reunión:

Meeting Planner Email Commands - Add a Meeting PlaceMeeting Planner Email Commands - Add a Meeting PlaceMeeting Planner Email Commands - Add a Meeting Place

En segundo lugar, echemos un vistazo a aceptar todas las fechas y horas:

En este caso, necesitamos aceptar todas las horas para esa reunión y $actor_id. La aceptación se hace de manera transparente detras de escena. Después de eso, podemos redirigirlos para ver la reunión.

Esto es lo que parece al llegar a la vista de la reunión con todo lo aceptado, ej. okay, okay, okay para lugares y horas a continuación:

Meeting Planner Email Commands - Accept all places and timesMeeting Planner Email Commands - Accept all places and timesMeeting Planner Email Commands - Accept all places and times

Una historia divertida

La implementación de todos estos comandos definitivamente tomó algún tiempo, pero las características de Meeting Planner realmente comenzaron a tomar vida. Y pude enviar mis primeras invitaciones al mundo.

Una mujer que había estado saliendo sabía que me estaba acercando a terminar esta funcionalidad por lo que decidió motivarme para terminarlo más rápidamente. Ella dijo:

"No tengo ni idea de cuándo voy a verte porque todavía no he recibido mi invitación en Meeting Planner".

Con un par de días de trabajo extra, le envié la invitación al segundo planificador de reuniones—la primera fue a un amigo para que la probaran.

Impresionantemente, cuando mi fecha recibió su invitación, rápidamente pidió dos características útiles. En primer lugar, dijo que no estaba segura de que sería capaz de presentarse a nuestra cita a menos que el evento estuviera en el calendario de Google de su teléfono (generalmente prefiero salir con usuarios de iOS, no Android). El siguiente tutorial contará la historia de la construcción de un archivo iCal (.ics) para la importación (por lo que mi fecha sabría a dónde ir). No te mantendré en suspenso—terminé la función a tiempo para nuestra cita.

En segundo lugar, ella pidió una característica que había pensado pero no había pensado su importancia. Ella quería ser capaz de especificar un lugar con un tiempo. En otras palabras, Canlis Restaurant el viernes a las 7pm pero Paseo el sábado a las 8pm. Actualmente, los lugares y las horas se ofrecen por separado y no en combinación. Guardaré esta función para un episodio futuro.

Esto plantea la cuestión general de cómo durante el proceso de inicio que regularmente reunir comentarios de la gente e integrar en sus necesidades y la planificación del desarrollo. No todos sus usuarios le ofrecerán fechas a cambio de sus características favoritas. Tengo un episodio tutorial planeado para discutir cómo hacer esto en el futuro, así, a pesar de la falta de motivación secundaria.

¿Que sigue?

En el siguiente episodio, detallaré la creación de archivos de calendario (.ics) para importarlos a Google Calendar, Outlook y Apple Calendar con los detalles de la invitación. Incluyendo detalles de contacto y mapas y gestión de los problemas de zona horaria son todos los aspectos clave de esto.

Vea los próximos tutoriales en mi serie Creando su Startup Con PHP, espero que esté ansioso por probar Meeting Planner. ¡Pruébalo ahora!

Por favor, no dude en agregar sus preguntas y comentarios a continuación; Trato de participar en las discusiones regularmente. También puede contactarme 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.