Azure, SMTP y PowerShell

Me encontré con la necesidad de utilizar algún servicio de envío SMTP en Azure. La idea es poder enviar correos informando sobre ciertas acciones o situaciones de deploy, para una solución en particular. Dentro de todo lo que ofrece Azure, existe un servicio de terceros (no es el único) para realizar el envío SMTP de forma gratuita. Éste servicio ofrece enviar sin costo adicional hasta 25.000 correos por mes con la suscripción free.

El servicio es ofrecido por la empresa SendGrid y puede utilizarse también fuera de Azure.

Ahora bien, que necesitamos para poder utilizar el servicio? Primero, habilitarlo en Azure…

Desplegar SendGrid en Azure

Para desplegar el servicio, debemos desde el portal buscar lo siguiente: SendGrid Email Delivery y seleccionar create.

Crear el servicio de SendGrid en Azure

Completamos el asistente con datos simples como contraseña, nombre y fundamental: el tipo de suscripción (free!). Ya con lo anterior, si revisamos el recurso que se muestra en el resource group tenemos lo siguiente:

Dashboard SendGrid en Azure

Mandar el primer mail

Obviamente vamos a utilizar PowerShell para realizar el envío de mail, pero de que manera? A través de Azure Functions…

Como el sentido del post no es avanzar sobre Azure Functions, adjunto una entrada anterior que habla al respecto del tema:

https://blog.victorsilva.com.uy/azure-functions/

No importa el tipo de template que utilicemos para generar la function app, el sentido del post es utilizar el servicio de SMTP principalmente. Para el ejemplo utilicé el template Timer trigger.

Continuando con la estructura de lo que nos interesa, pasamos a ver el código.

Lo primero es destacar que cmdlet vamos a usar. Para enviar un mail tenemos Send-MailMessage. Con el cmdlet anterior vamos a necesitar ciertos valores que serán nuestras variables:

  • $userName
  • $password
  • $smtpServer
  • $emailFrom
  • $emailTo
  • $subject
  • $body

Al ser información sensible, lo recomendado es utilizar algún mecanismo para poder proteger estos datos. Para ello utilizamos la sección de Application Settings dentro de la function app creada.

De esta manera almacenamos información del tipo clave-valor utilizando el botón +Add new setting como indica la siguiente imagen:

Add new setting en Aure Functions

Ahora que tenemos esos valores dentro de un entorno más seguro, resta definir como trabajamos sobre ellas.

Al estar trabajando sobre PowerShell, todas las AppSettings se almacenan con la siguiente estructura:

$ENV:APPSETTING_<setting>

En resumen, tendríamos que definir las variables con la información necesaria, generar las credenciales y utilizar el cmdlet Send-MailMessage para enviar un correo de prueba:

  #Obtengo los valores de AppSettings
  $User = $ENV:APPSETTING_SendGridUserName
  $PasswordText = $ENV:APPSETTING_SendGridPassword
  $smtpServer = $ENV:APPSETTING_SendGridServer
  #Genero las credenciales
  $Password = (ConvertTo-SecureString $PasswordText -AsPlainText -Force)
  $credential = New-Object System.Management.Automation.PSCredential $User, $Password
  #Defino información para enviar el mail
  $subject = "Test"
  $emailFrom = "[email protected]"
  $emailTo = "[email protected]"
  #Genero el cuerpo del mail
  $body = @"
  Mensaje de prueba
  "@
  #Envío el mail
  Send-MailMessage -smtpServer $smtpServer -Credential $credential -Usessl -Port 587 -from $emailFrom -to $emailTo -subject $subject -Body $body

Simple, no? Para el ejemplo ya tenemos configurado un sistema de envío de correos utilizando Azure Functions y SendGrid.

Happy scripting!

Comments