Trabajar con notificaciones mediante los servicios SendGrid y Twilio

En este capítulo, veremos lo siguiente:
• Enviar una notificación por correo electrónico al administrador de un sitio web mediante el servicio SendGrid
• Enviar una notificación de correo electrónico dinámicamente al usuario final
• Implementar el registro de correo electrónico en Azure Blob Storage
• Modificar el contenido del correo electrónico para incluir un archivo adjunto
• Enviar una notificación por SMS al usuario final utilizando el servicio Twilio

Introducción
Para que cada aplicación empresarial ejecute sus operaciones comerciales sin problemas, una de las características clave es tener un sistema de comunicación fiable entre la empresa y sus clientes. El canal de comunicación puede ser bidireccional, ya sea enviando un mensaje a los administradores que gestionan la aplicación o enviando alertas a los clientes por correo electrónico o SMS a sus teléfonos móviles.
Azure puede integrarse con dos servicios de comunicación populares: SendGrid para correos electrónicos y Twilio para trabajar con SMS. En este capítulo, usaremos estos dos servicios de comunicación para descubrir cómo aprovechar sus servicios básicos para enviar mensajes entre los administradores empresariales y los usuarios finales.
A continuación, se muestra la arquitectura que usaremos para utilizar los enlaces
de salida de SendGrid y Twilio con el desencadenador de HTTP y el desencadenador
de cola.

Enviar una notificación por correo electrónico al administrador de un sitio web mediante el servicio SendGrid
En esta receta, descubrirás cómo crear un enlace de salida de SendGrid y enviar una notificación por correo electrónico, con contenido estático, al administrador del sitio web. Nuestro caso de uso solo involucra a un administrador, por lo que codificaremos la dirección de correo electrónico del administrador en el campo. Destinatario del enlace de salida (mensaje) de SendGrid.

Preparación
Seguiremos estos pasos antes de continuar:

  1. Crear una clave de API de la cuenta de SendGrid desde el portal
    de administración de Azure
  2. Generar una clave de API desde el portal de SendGrid
  3. Configurar la clave de API de SendGrid con la aplicación Azure Function

Creación de una cuenta de SendGrid
Sigue estos pasos:

  1. Desplázate al portal de administración de Azure y crea una cuenta
    de Entrega de correo electrónico de SendGrid buscándola en el marketplace,
    como se muestra en la siguiente captura de pantalla:
  1. En la hoja Entrega de correo electrónico de SendGrid, haz clic en el botón
    Crear para ir a Crear una nueva cuenta de SendGrid. Selecciona gratis en
    las opciones de Nivel de precios, proporciona todos los demás detalles y,
    a continuación, haz clic en el botón Crear, como se muestra en la siguiente
    captura de pantalla:

En el momento de la redacción, la cuenta gratuita de SendGrid
nos permite enviar 25 000 correos electrónicos gratuitos al mes.
Si deseas enviar más correos electrónicos, puedes obtener una
cuenta de nivel Silver S2, donde dispondrías de 100 000 correos
electrónicos al mes.

  1. Una vez creada la cuenta correctamente, desplázate hasta Cuentas de
    SendGrid. Puedes usar el cuadro de búsqueda disponible en la parte
    superior, como se muestra en la siguiente captura de pantalla:
  1. Ve a Configuración, selecciona Configuraciones y recupera USERNAME
    y SMTP SERVER de la hoja Configuraciones, como se muestra en la
    siguiente captura de pantalla:

Generar una clave de API desde el portal de SendGrid
Sigue estos pasos:

  1. Para poder utilizar la cuenta de SendGrid en el runtime de Azure Functions,
    debemos proporcionar la clave de API de SendGrid como una entrada
    de Azure Functions. Puedes generar una clave de API desde el portal
    de SendGrid. Vayamos al portal de SendGrid haciendo clic en el botón
    Administrar en la hoja Essentials de la cuenta de SendGrid, como se
    muestra en la siguiente captura de pantalla:
  1. En el portal de SendGrid, haz clic en Claves de API en la sección
    Configuración del menú del lado izquierdo, como se muestra en la
    siguiente captura de pantalla:
  1. En la página Claves de API, haz clic en Crear clave de API, como se
    muestra en la siguiente captura de pantalla:
  1. En la ventana emergente Crear clave de API, proporciona un nombre
    y selecciona Permisos de clave de API y, a continuación, haz clic en el botón
    Crear y ver.
  2. Al cabo de unos momentos, podrás ver la clave de API. Haz clic en la clave
    para copiarla en el portapapeles, como se muestra en la siguiente captura
    de pantalla:

Configurar la clave de API de SendGrid con la aplicación Azure Function
Sigue estos pasos:

  1. Crea una nueva Configuración de la aplicación en la aplicación Azure
    Function desplazándote hasta la hoja Configuración de la aplicación, que
    se encuentra en la sección Características de la plataforma de la aplicación
    de función, como se muestra en la siguiente captura de pantalla:

2. Haz clic en el botón Guardar después de añadir la configuración de la
aplicación en el paso anterior.

Cómo hacerlo…
En esta sección, seguiremos estos pasos.

  1. Crear un enlace de la cola de almacenamiento al desencadenador de HTTP
  2. Crear un desencadenador de cola para procesar el mensaje del
    desencadenador de HTTP
  3. Crear un enlace de salida de SendGrid al desencadenador de cola
  4. Crear un enlace de salida de Twilio al desencadenador de cola

Crear un enlace de la cola de almacenamiento al desencadenador de HTTP
Sigue estos pasos:

  1. Ve a la pestaña Integrar de la función RegisterUser y haz clic en el botón
    Nueva salida para añadir un nuevo enlace de salida.
  2. Selecciona Azure Queue Storage y haz clic en el botón Seleccionar para
    añadir el enlace y proporcionar los valores que se muestran a continuación;
    luego, haz clic en el botón Guardar. Escribe el nombre de la cola (en este
    caso, notificationqueue) que se usará en un momento.
  1. Desplázate hasta el método Run de la función RegisterUser y realiza los
    siguientes cambios resaltados. Hemos añadido otro enlace de salida de
    cola y un mensaje de salida para desencadenar la función Desencadenador
    de cola. Por el momento, no hemos añadido ningún mensaje a la cola.
    Realizaremos cambios al método NotificationQueueItem.AddAsync(«»);
    en la próxima receta del capítulo.
    public static async Task Run(
    HttpRequest req,
    CloudTable objUserProfileTable,
    IAsyncCollector objUserProfileQueueItem,
    IAsyncCollector NotificationQueueItem,
    ILogger log)
    {
    log.LogInformation(«C# HTTP trigger function processed a
    request.»);
    string firstname=null,lastname = null;


    await NotificationQueueItem.AddAsync(«»);
    return (lastname + firstname) != null
    ? (ActionResult)new OkObjectResult($»Hello, {firstname + «
    » + lastname}»)
    : new BadRequestObjectResult(«Please pass a name on the

    query» +
    «string or in the request body»);
    }

Crear un desencadenador de cola para procesar el mensaje del desencadenador de HTTP

  1. Crea un desencadenador de Azure Queue Storage seleccionando la plantilla
    que se muestra a continuación.
  1. En el paso siguiente, proporciona todo el nombre del desencadenador de
    cola y escribe el nombre de la cola que se debe supervisar para enviar las
    notificaciones. Después de proporcionar todos los detalles, haz clic en el
    botón Crear para crear la función.
  1. Después de crear la función Desencadenador de cola, vamos a ejecutar la
    función RegisterUser para ver si se invoca el desencadenador de cola. Abre
    la función RegisterUser en una pestaña nueva y pruébala haciendo clic en
    el botón Ejecutar. En la ventana Registros de la pestaña SendNotifications,
    deberías ver algo parecido a lo que se muestra a continuación:

Después de asegurarnos que el desencadenador de cola funciona como se esperaba,
vamos a crear los enlaces de SendGrid para enviar el correo electrónico.

Crear un enlace de salida de SendGrid al desencadenador de cola

  1. Ve a la pestaña Integrar de la función SendNotifications y haz clic en el botón
    Nueva salida para añadir un nuevo enlace de salida.
  2. Selecciona el enlace de SendGrid y haz clic en el botón Seleccionar para
    añadir el enlace.
  3. El siguiente paso es instalar las extensiones de SendGrid. Haz clic en el
    botón Instalar para instalar las extensiones. La instalación de las extensiones
    puede tardar unos minutos.
  4. Proporciona los siguientes parámetros en el enlace de salida (mensaje)
    de SendGrid:
    ° Nombre del parámetro del mensaje: deja el valor predeterminado, que es message. Utilizaremos este parámetro en el método Run en unos momentos.
    ° Clave de API de SendGrid: selecciona la clave de Configuración de la aplicación que has creado en Configuración de la aplicación para almacenar la clave de API de SendGrid.
    ° Destinatario: escribe la dirección de correo electrónico del administrador.
    ° Remitente: escribe la dirección de correo electrónico desde la que deseas enviar el mensaje. Puede ser parecida a donotreply@example.com.
    ° Asunto del mensaje: proporciona el asunto que deseas que se muestre en el asunto del correo electrónico.
    ° Texto del mensaje: proporciona el cuerpo del correo electrónico que deseas en el cuerpo del correo electrónico.
  5. A continuación, podemos ver el aspecto del enlace de salida (mensaje)
    de SendGrid después de rellenar todos los campos:
  1. Después de revisar los valores, haz clic en Guardar para guardar los cambios.
  2. Desplázate hasta el método Run de las funciones SendNotifications y
    realiza los siguientes cambios:
    ° Agrega una referencia nueva para SendGrid, junto con el espacio
    de nombres SendGrid.Helpers.Mail.
    ° Agrega un nuevo mensaje de parámetro del tipo SendGridMessage.
    ° Crea un objeto del tipo SendGridMessage. Vamos a ver cómo utilizar
    este objeto en la siguiente receta.
  3. A continuación, vemos el código completo del método Run:
  1. Ahora, vamos a probar la funcionalidad de envío del correo electrónico
    yendo a la función RegisterUser y enviando una solicitud con algunos
    valores de prueba, de la siguiente manera:

Cómo funciona…
El objetivo de esta receta es enviar una notificación por correo electrónico al
administrador, enviándoles una actualización para informarle de que se ha creado
un registro nuevo.
Hemos usado uno de los enlaces de salida de Azure Function, denominado
SendGrid, como un servidor Protocolo simple de transferencia de correo (SMTP)
para enviar nuestros correos electrónicos codificando las propiedades siguientes en
los enlaces de salida (mensaje) de SendGrid:

  • El «remitente» del correo electrónico
  • El «destinatario» del correo electrónico
  • El asunto del correo electrónico
  • El cuerpo del correo electrónico

Los enlaces de salida (mensaje) de SendGrid utilizarán la clave de API
proporcionada en Configuración de la aplicación para invocar las API necesarias
de la biblioteca SendGrid para enviar los correos electrónicos.

Y eso no es todo
Al agregar los enlaces de SendGrid, se te solicitará que instales las extensiones como
se muestra a continuación.

Si no las puedes ver, elimina el enlace de salida y vuelve a crearlas. También puedes
instalar manualmente las extensiones si sigues las instrucciones que se mencionan
en el artículo https://docs.microsoft.com/azure/azure-functions/installupdate-
binding-extensions-manual.

Enviar una notificación de correo electrónico dinámicamente al usuario final
En la receta anterior, hemos codificado la mayoría de los atributos relacionados
con el envío de un correo electrónico a un administrador, ya que solo había un
administrador. En esta receta, modificaremos la receta anterior para enviar un
correo electrónico de agradecimiento por inscribirse a los propios usuarios.

Preparación
Asegúrate de que lo siguiente está configurado correctamente:

  • Se ha creado la cuenta de SendGrid y se ha generado una clave de API
    en el portal de SendGrid.
  • Se ha creado la Configuración de la aplicación en la Configuración
    de la aplicación de la aplicación de la función.
  • La clave de Configuración de la aplicación se ha configurado en los enl
    aces de salida (mensaje) de SendGrid.

Cómo hacerlo…
En esta receta, actualizaremos el código en el archivo run.csx de las siguientes
Azure Functions

  • RegisterUser
  • SendNotifications

Aceptar el nuevo parámetro de correo electrónico en la función RegisterUser
Sigue estos pasos:

  1. Ve a la función RegisterUser, que se encuentra en el archivo run.csx,
    agrega una nueva variable de cadena que acepte un nuevo parámetro de
    entrada, denominada email, desde el objeto de solicitud, de la forma
    siguiente. Además, ten en cuenta que estamos serializando el objeto
    UserProfile y almacenando el contenido JSON en el mensaje de cola:
    string firstname=null,lastname = null, email = null;


    string email = inputJson.email;


    UserProfile objUserProfile = new UserProfile(firstname,
    lastname,email);


    await
    NotificationQueueItem.AddAsync(JsonConvert.SerializeObject(objUser
    Profile));
  2. Actualiza el siguiente código resaltado de la clase UserProfile y haz clic en
    el botón Guardar para guardar los cambios:
    public class UserProfile : TableEntity
    {
    public UserProfile(string firstname,string lastname,
    string profilePicUrl,string email)
    {
    ….
    ….
    this.ProfilePicUrl = profilePicUrl;
    this.Email = email;
    }
    ….
    ….
    public string ProfilePicUrl {get; set;}

    public string Email { get; set; }
    }

Recuperar la información de UserProfile en el desencadenador SendNotifications
Sigue estos pasos

  1. Desplázate hasta la función SendNotifications, en el archivo run.csx,
    agrega la referencia NewtonSoft.Json y también el espacio de nombres.
  2. El desencadenador de cola recibirá la entrada en forma de cadena JSON.
    Utilizaremos el método JsonConvert.DeserializeObject para convertir la
    cadena en un objeto dinámico para que podamos recuperar las propiedades
    individuales. Reemplaza el código existente por el código siguiente donde
    se rellenan dinámicamente las propiedades de SendGridMessage desde
    el código.
  1. Vamos a ejecutar una prueba agregando un nuevo correo electrónico
    de campo de entrada a la carga de la solicitud de pruebas, que se muestra
    de la siguiente manera:

4. Esta es la captura de pantalla del correo electrónico que he recibido:

Cómo funciona…
Hemos actualizado el código de la función RegisterUser para aceptar otro
parámetro nuevo, denominado email.
La función acepta el parámetro email y envía el correo al usuario final mediante la
API de SendGrid. También hemos configurado todos los demás parámetros, como
el Remitente, el Asunto y el cuerpo (contenido) del código, para que se personalice
dinámicamente en función de los requisitos.

También podemos borrar los campos de los enlaces de salida de SendGrid, como
se muestra en la siguiente captura de pantalla:

Los valores especificados en el código tendrán prioridad
sobre los otros valores especificados en el paso anterior.

Y eso no es todo…
También puedes enviar contenido HTML en el cuerpo para que el correo electrónico
sea más atractivo. El siguiente es un ejemplo sencillo, en el que acabo de aplicar una
etiqueta de negrita () al nombre de usuario final:

La siguiente es la captura de pantalla del correo electrónico, con mi nombre
en negrita:

Implementar el registro de correo electrónico en Azure Blob Storage
La mayoría de las aplicaciones empresariales de los correos electrónicos
automatizados probablemente impliquen el envío de correos electrónicos que
contengan notificaciones, alertas, etc., al usuario final. A veces, los usuarios pueden
quejarse de que no han recibido ningún correo electrónico, aunque no vemos ningún
error en la aplicación al enviar dichas alertas de notificación.
Puede haber varias razones por las que los usuarios no han recibido el correo
electrónico. Cada uno de los proveedores de servicios de correo electrónico tiene
diferentes filtros de correo no deseado que pueden bloquear los correos electrónicos
de la bandeja de entrada del usuario final. Pero estos correos electrónicos pueden
tener información importante que los usuarios pueden necesitar. Tiene sentido
almacenar el contenido de todos los correos electrónicos que se envían a los usuarios
finales para que podamos recuperar los datos en un paso posterior para solucionar
problemas imprevistos.
En esta receta, aprenderás a crear un nuevo archivo de registro de correo electrónico
con la extensión .log para cada nuevo registro. Este archivo de registro se puede
utilizar como redundancia para los datos almacenados en el almacenamiento de
tablas. También aprenderás a almacenar los archivos de registro de correo electrónico
como un blob en un contenedor de almacenamiento, junto con los datos introducidos
por el usuario final durante el registro.

Cómo hacerlo…
Sigue estos pasos:

  1. Desplázate hasta la pestaña Integrar de la función SendNotifications,
    haz clic en Nueva salida y selecciona Azure Blob Storage. Se te pedirá que
    instales las extensiones de almacenamiento; instálalas para continuar.
  2. Proporciona los parámetros necesarios en la sección de salida Azure Blob
    Storage, como se muestra en la siguiente captura de pantalla. Ten en cuenta
    la extensión .log en el campo Ruta:
  1. Ve al editor de código del archivo run.csx de la función
    SendNotifications y realiza los siguientes cambios:
    • Añade un nuevo parámetro outputBlob del tipo TextWriter al
      método Run.
    • Añade una nueva variable de cadena denominada emailContent.
      Esta variable se utiliza para enmarcar el contenido del correo
      electrónico. También utilizaremos la misma variable para crear el
      contenido del archivo de registro que se almacena en el blob.
    • Enmarca el contenido del correo electrónico anexando el texto
      estático necesario y los parámetros de entrada recibidos en Cuerpo
      de la solicitud, como se indica a continuación:
  1. Ejecuta una prueba con la misma carga de solicitud que usamos en la receta
    anterior.
  2. Después de ejecutar la prueba, el archivo de registro se creará en el
    contenedor denominado userregistrationemaillogs:

Cómo funciona…
Hemos creado nuevos enlaces de salida de Azure Blob. Tan pronto como se recibe
una nueva solicitud, el contenido del correo electrónico se crea y se escribe en
un nuevo archivo .log (ten en cuenta que también puedes usar cualquier otra
extensión) que se almacena como un blob en el contenedor especificado en el
campo Ruta de los enlaces de salida.

Modificar el contenido del correo electrónico para incluir un archivo adjunto
En esta receta, aprenderás a enviar un archivo como un adjunto al usuario registrado.
En la receta anterior, creamos un archivo de registro del contenido de correo
electrónico. Enviaremos el mismo archivo como un adjunto al correo electrónico.
Sin embargo, en las aplicaciones del mundo real, podrías no desear enviar archivos
de registro al usuario final. Para simplificar la tarea, enviaremos el archivo de
registro como un archivo adjunto.

En el momento de escribir, SendGrid recomienda que el
tamaño del archivo adjunto no exceda los 10 MB, aunque,
técnicamente, el correo electrónico puede llegar a ser de 20 MB

Preparación
Esta receta es una continuación de la receta anterior. Si estás leyendo esto primero,
asegúrate de repasar previamente las recetas de este capítulo.

Cómo hacerlo…
Tendremos que seguir estos pasos antes de continuar:

  1. Realizar los cambios en el código para crear un archivo de registro con
    RowKey de la tabla. Lo lograremos usando la interfaz IBinder.
  2. Enviar este archivo como un archivo adjunto al correo electrónico.

Personalizar el nombre del archivo de registro utilizando la interfaz IBinder
Sigue estos pasos:

  1. Ve hasta el archivo run.csx de la función SendNotifications.
  2. Borra el objeto TextWriter y sustitúyelo por el enlazador de variables del
    tipo IBinder. A continuación, se muestra la nueva firma del método Run con
    los cambios resaltados:
  1. Hemos eliminado el objeto TextWriter y la función outputBlob.
    WriteLine(emailContent); dejará de funcionar. Vamos a sustituirla por
    el siguiente fragmento de código:
  1. Ejecutemos una prueba con la misma carga de solicitud que usamos
    en las recetas anteriores.
  2. Puedes ver el archivo de registro de correo electrónico que se crea con la
    RowKey del nuevo registro almacenado en el almacenamiento de tablas
    de Azure, como se muestra en la siguiente captura de pantalla:

Agregar un archivo adjunto al correo electrónico
Sigue estos pasos:

  1. Agrega el siguiente código al método Run de la función SendNotifications
    y guarda los cambios haciendo clic en el botón Guardar:
  1. Ejecuta una prueba usando la misma carga de solicitud que hemos usado en
    las recetas anteriores.
  1. Esta es la captura de pantalla del correo electrónico, junto con el archivo
    adjunto:

Puedes obtener más información sobre la API de SendGrid en
https://sendgrid.com/docs/API_Reference/api_v3.html

Enviar una notificación por SMS al usuario final utilizando el servicio Twilio
En la mayoría de las recetas anteriores de este capítulo, hemos trabajado con
desencadenadores SendGrid para enviar correos electrónicos en diferentes
escenarios. En esta receta, aprenderás a enviar notificaciones a través de SMS,
utilizando Twilio, una de las plataformas de comunicación en el cloud líderes
en el sector.

También puedes obtener más información
acerca de Twilio en
https://www.twilio.com/.

Preparación
Par poder usar el enlace Twilio SMS output (objsmsmessage), tenemos que hacer
lo siguiente:

  1. Crear una cuenta de prueba de Twilio en https://www.twilio.com/trytwilio.
  2. Después de haber creado la cuenta correctamente, toma ACCOUNT SID
    y AUTH TOKEN del panel de Twilio, como se muestra en la siguiente
    captura de pantalla. Crearemos dos configuraciones de la aplicación en la
    hoja Configuración de la aplicación de la aplicación de función para dos
    de estas configuraciones:
  1. Para empezar a enviar mensajes, debes crear un número activo en Twilio,
    que se utilizará como número remitente para enviar el SMS. Puedes crear
    y administrar números en el panel de números de teléfono. Desplázate
    hasta https://www.twilio.com/console/phone-numbers/incoming y haz
    clic en el botón Primeros pasos, como se muestra en la siguiente captura
    de pantalla:
  1. En la página Primeros pasos con números de teléfono, haz clic en Obtén tu
    primer número de teléfono Twilio, como se muestra en la siguiente captura
    de pantalla:

5. Después de obtenerlo, se enumerará de la siguiente manera:

  1. El último paso es verificar un número al que te gustaría enviar un SMS. Solo
    puedes tener un número en la cuenta de prueba. Puedes verificar un número
    en la página Verified de Twilio, disponible en https://www.twilio.com/
    console/phone-numbers/verified. A continuación, vemos una captura
    de pantalla de la lista de números verificados:

Cómo hacerlo…
Sigue estos pasos:

  1. Desplázate hasta la hoja Configuración de la aplicación de la aplicación
    de función y agrega dos claves para almacenar TwilioAccountSID
    y TwilioAuthToken, como se muestra a continuación:
  1. Ve a la pestaña Integrar de la función SendNotifications, haz clic en Nueva
    salida y selecciona Twilio SMS.
  2. Haz clic en Seleccionar y proporciona los valores siguientes a los enlaces
    de salida de Twilio SMS. Instala las extensiones de Twilio. El número
    remitente es el número que se ha generado en el portal de Twilio y del que
    ya hemos hablado en la sección Preparación de esta receta:
  1. Ve al editor de código y agrega las siguientes líneas de código, resaltadas
    en negrita. En el código siguiente, he codificado el número destinatario. Sin
    embargo, en escenarios del mundo real, recibirás dinámicamente el número
    de móvil del usuario final y enviarás el SMS a través del código:
  1. Ahora, hagamos una ejecución de prueba de la función RegisterUser
    utilizando la misma carga de solicitud.
  2. A continuación, vemos la captura de pantalla del SMS que he recibido:

Cómo funciona…
Hemos creado una nueva cuenta de Twilio y hemos copiado el ID de cuenta
y la clave de aplicación en Configuración de la aplicación de la aplicación Azure
Function. El runtime de la aplicación de función utilizará estas dos configuraciones
para conectarse a la API de Twilio para enviar el SMS.
Para simplificar la tarea, he codificado el número de teléfono en los enlaces de salida.
Sin embargo, en las aplicaciones del mundo real, el SMS se enviaría al número de
teléfono proporcionado por los usuarios finales.
Puedes visionar el vídeo https://www.youtube.com/watch?v=ndxQXnoDIj8 para
ver una implementación que funcione.