Usar Azure para enviar correos electrónicos con SendGrid, Graph y Office 365

Microsoft Azure no tiene un servicio de entrega de correo electrónico. Ya sea que esté probando aplicaciones o desarrollando scripts en Azure para enviar correos electrónicos, sepa que no hay un servicio de correo nativo disponible para usted.

La conexión SMTP saliente a través del puerto 25 está completamente bloqueada en Azure también. Si es un cliente empresarial, puede solicitar desbloquear el puerto 25 para su inquilino de Azure. De lo contrario, ¿cómo más puede enviar correos electrónicos desde Azure?

Normalmente hay dos formas de permitir el envío de correos electrónicos desde Azure: utilizando un servidor SMTP y solicitudes API REST. La mayoría de los servicios de entrega de correo electrónico ofrecen ambos métodos de envío de correos electrónicos. En este artículo, aprenderá cómo enviar correos electrónicos desde Azure al resto del mundo.

Prerrequisitos

Este artículo es una guía práctica y si planea seguir los ejemplos a medida que avanzan, hay algunos requisitos que debe cumplir.

Conocer qué servicios de correo electrónico usar con Azure para enviar correos electrónicos

Hay varios servicios de correo electrónico en la nube disponibles para usar. Algunos de los nombres prominentes son SendGrid, MailJet, y MailGun. Cualquiera sea el servicio de correo electrónico que elijas, usarlos para enviar correos electrónicos desde Azure es similar; dirección del servidor y puerto para SMTP y dirección del punto de conexión de la API para REST.

SendGrid es un ejemplo de un servicio de correo electrónico de terceros utilizado en este artículo. Servicios de correo electrónico adicionales utilizados como ejemplos son Relé SMTP de Office 365 y Microsoft Graph API.

Relacionado: Cómo elegir un servicio de correo electrónico de Azure para 2021

Uso de SendGrid

SendGrid es probablemente la opción de servicio de correo electrónico más popular para enviar correos electrónicos desde Azure. Azure y SendGrid son tan populares porque solían ofrecer un plan gratuito con un límite de 25,000 correos electrónicos por mes para los clientes de Azure.

Aunque el plan gratuito ya no se ofrece en el portal de Azure, como lo confirmó Microsoft, es posible registrarse para obtener una suscripción gratuita con un límite de 100 correos electrónicos por día. Entonces, tendrás acceso al servicio de retransmisión SMTP de SendGrid o a la API de correo electrónico para enviar correos electrónicos desde una aplicación o VM de Azure.

Creación de una cuenta de SendGrid

Para utilizar los servicios de SendGrid, primero debes tener una cuenta de SendGrid. Ve a la página de Registro, y deberías ver el formulario como se muestra a continuación. Ingresa tu dirección de correo electrónico y la contraseña que elijas. Luego, acepta los términos y haz clic en el botón Crear cuenta.

Signing up for a free SendGrid account

En la siguiente página, debes ingresar tu nombre e información de la empresa. También necesitas seleccionar las opciones apropiadas, como tu rol, los correos electrónicos a enviar por mes y el número de empleados. Luego, haz clic en Empezar.

Entering your account information

Cuando inicies sesión por primera vez en SendGrid, es posible que obtengas un error que diga: “No estás autorizado para acceder a SendGrid; por favor, contacta al Soporte”. Cuando esto suceda, abre un ticket con el soporte de SendGrid. Es posible que necesiten hacer algunas preguntas de verificación antes de desbloquear tu acceso.

Se te pedirá que habilites la autenticación de dos factores durante tu primer inicio de sesión. Asegúrate de seguir las instrucciones con precisión.

Creación de una Identidad de Remitente de SendGrid

Después de crear la cuenta de SendGrid, el siguiente paso es autorizar la identidad del remitente. Hay dos opciones; autenticar un único remitente (por ejemplo, [email protected]) o autenticar un dominio entero (por ejemplo, dominio.com).

En este ejemplo, crearás una identidad de remitente único que servirá como tu dirección de remitente. Solo la dirección de remitente verificada podrá enviar mensajes a través del servicio de SendGrid. Sigue las instrucciones a continuación para crear la identidad de remitente único.

  1. En la página de Bienvenida, haz clic en el botón Crear un Remitente Único.
Creating a single sender

2. Luego, en el menú desplegable Crear un Remitente, proporciona toda la información requerida. Los campos obligatorios están marcados con un asterisco rojo junto a ellos para una referencia más fácil. Después de ingresar los detalles, haz clic en Crear.

Providing the sender details

Verás la nueva dirección del remitente enlistada bajo la página de Verificación de Remitente Único. Como se puede observar en el ejemplo a continuación, la dirección aún no está verificada, como indica una X roja en la columna VERIFICADO.

Viewing the sender address verification status

3. Para verificar al remitente, localiza el correo enviado a la dirección del remitente, similar a la captura de pantalla a continuación. Luego, haz clic en el botón Verificar Remitente Único.

Verifying the Single Sender address

La dirección del remitente quedará verificada. Deberías ver una página similar, como se muestra a continuación, confirmando que la verificación del remitente está completa.

Confirming that the sender address verification is complete

Creación de una Clave de API de SendGrid

Después de crear la dirección de remitente único, la interfaz para crear claves de API se vuelve disponible. Piensa en la clave de API de SendGrid como la contraseña. Sin ella, tu código no puede autenticarse con el servicio de retransmisión SMTP de SendGrid. Sigue los pasos a continuación para crear una nueva clave de API.

  1. En el menú del lado izquierdo, haz clic en Configuración > Claves de API. Luego, haz clic en el botón Crear Clave de API en la esquina superior derecha de la página.
Creating a new SendGrid API key

2. Aparece el desplegable Crear Clave de API. Ingresa el nombre de la clave de API que estás creando. Usa un nombre que tenga sentido, como “Clave de API de Prueba de Azure“. Luego, por simplicidad, selecciona Acceso Completo como permiso. Finalmente, haz clic en el botón Crear y Ver.

Naming the API key and choosing permissions

3. A continuación, se muestra la nueva Clave de API. Ahora, cópiala y guárdala, ya que no se mostrará nuevamente. Después de copiar la clave, haz clic en Hecho.

Saving the new SendGrid API key

Envío de un Correo Electrónico desde Azure usando el Relevo SMTP de SendGrid

Ahora tienes los componentes necesarios (cuenta, remitente y clave) para usar SendGrid y enviar correos electrónicos desde Azure. Es hora de probar si el servicio de retransmisión SMTP de SendGrid funciona. En esta sección, vas a utilizar PowerShell para enviar correos electrónicos desde una VM de Azure.

Antes de ejecutar cualquier código, debes conocer estos requisitos.

  • La dirección del servidor SMTP de SendGrid es smtp.sendgrid.net.
  • El nombre de usuario utilizado para la autenticación SMTP siempre es apikey.
  • La contraseña a utilizar es el valor de la clave API que creaste en SendGrid.
  • No uses el puerto 25. En su lugar, utiliza el puerto 587.
  • Solo la dirección de remitente verificada en SendGrid es válida para usar como remitente de tus correos electrónicos. En este ejemplo, el remitente autorizado es [email protected].

El script a continuación enviará un correo electrónico a través de la retransmisión SMTP de SendGrid. Copia el código a continuación y cambia los valores de $sendGridApiKey, From, To, y Body. Luego, ejecuta el código en tu sesión de PowerShell. Consulta los comentarios para entender qué hace cada línea de código.

# Establece tu clave de API aquí
$sendGridApiKey = 'SG...........P258'

$SendGridEmail = @{
	# Utiliza tu dirección de remitente verificada.
	From = '[email protected]'
	# Especifica el destinatario del correo electrónico. Debería funcionar cualquier dirección de correo electrónico válida.
	To = '[email protected]'
	# Actualiza esto con el asunto del correo electrónico que deseas usar.
	Subject = 'This is a test message from Azure via SendGrid'
	# Actualiza esto con el cuerpo del correo electrónico o el mensaje que deseas enviar.
	Body = 'This is a test message from Azure via SendGrid'
	
	# NO CAMBIES NADA POR DEBAJO DE ESTA LÍNEA
	SmtpServer = 'smtp.sendgrid.net'
	Port = 587
	UseSSL = $true
	Credential = New-Object PSCredential 'apikey', (ConvertTo-SecureString $sendGridApiKey -AsPlainText -Force)	
}

# Envía el correo electrónico
Send-MailMessage @SendGridEmail

La demostración a continuación muestra cómo se ve en tiempo real ejecutar el código anterior en PowerShell.

Sending an Email from Azure using SendGrid SMTP Relay

Para confirmar la entrega del correo electrónico, verifica el buzón del destinatario para encontrar el mensaje de prueba que enviaste. El resultado sería similar al que se muestra a continuación. Como puedes ver, el mensaje provino de la dirección del remitente a través de sendgrid.net.

Confirming the SMTP test message was delivered

Relacionado: Send-MailMessage: La forma de enviar correos electrónicos en PowerShell

Enviar un correo electrónico desde Azure usando la API de SendGrid

Otra forma de utilizar SendGrid con Azure para enviar correos electrónicos es mediante la API web V3 de SendGrid. En lugar de comunicarse con SendGrid a través de SMTP, el uso de la API implica la comunicación mediante HTTP. La solicitud HTTP se envía a la URL del punto final de la API de SendGrid.

El script de ejemplo de PowerShell a continuación utiliza el cmdlet Invoke-RestMethod para enviar la solicitud de correo electrónico desde Azure a SendGrid. Copia el código y cambia los valores de las variables $sendGridApiKey, $fromAddress, $toAddress, $mailSubject y $mailMessage.

Una vez que hayas terminado de actualizar las variables, ejecuta el código en PowerShell.

Set your API Key here
 $sendGridApiKey = 'SG………..P258'
 Set the sender and recipient addresses
 $fromAddress = "[email protected]"
 $toAddress = "[email protected]"
 Set the mail subject
 $mailSubject = "This is a test message from Azure via SendGrid API"
 Set the mail message
 $mailMessage = "This is a test message from Azure via SendGrid API"
 DO NOT CHANGE ANYTHING BELOW THIS LINE
 Compose the Mail Body
 $mailbody = @{
   personalizations = @(
     @{
       to      = @(
         @{
           email = $toAddress
         }
       )
       subject = $mailSubject
     }
   )
   from             = @{
     email = $fromAddress
   }
   content          = @(
     @{
       type  = "text/plain"
       value = $mailMessage
     }
   )
 } | ConvertTo-Json -Depth 10
 $headers = @{'Authorization' = "Bearer $($sendGridApiKey)" }
 $mailApiUri = 'https://api.sendgrid.com/v3/mail/send'
 Send the email
 Invoke-RestMethod -Method Post -Uri $mailApiUri -Body $mailbody -Headers $headers -ContentType application/json

Después de ejecutar el código de PowerShell anterior, verifica el buzón del destinatario y confirma que recibió el mensaje de prueba. El ejemplo a continuación muestra un mensaje de prueba entregado correctamente desde Azure a través de la API de SendGrid.

Confirming the API test message was delivered

Si deseas obtener más información sobre la API web de SendGrid, visita la página V3 Mail Send API.

Usando la autenticación SMTP de Office 365

Otra opción para enviar correos electrónicos de Azure es utilizar el retransmisor SMTP de Office 365. Esto es si tu organización ya tiene una suscripción a Exchange Online. Al igual que al utilizar SendGrid como un host inteligente SMTP, el retransmisor SMTP de Office 365 requiere autenticación y el uso del puerto 587 únicamente.

Antes de utilizar el retransmisor SMTP de Office 365, debes conocer las siguientes condiciones para que funcione.

  • La dirección del remitente debe ser un objeto de destinatario de Exchange Online válido, como un buzón o un usuario de correo. Pero, si se van a almacenar recibos de no entrega (NDR), utiliza un buzón en su lugar.
  • El usuario de autenticación debe tener una licencia válida de Exchange Online. Solo los usuarios con licencia de Exchange Online tienen permitido utilizar el retransmisor SMTP de Office 365.
  • Suponga que el usuario de autenticación es diferente del remitente. En ese caso, el usuario debe ser asignado el permiso de Enviar como a la cuenta del remitente.
  • El método de autenticación utilizado es básico (heredado). Esto significa que si la autenticación básica de SMTP está desactivada en su organización o cuando Microsoft finalmente elimine la autenticación básica, la autenticación SMTP dejará de funcionar.
  • La dirección del servidor de retransmisión SMTP es smtp.office365.com, y el número de puerto es 587.

Relacionado: Cómo enviar correo electrónico con Office 365 Direct Send y PowerShell

Creando una dirección de remitente de Office 365

En este ejemplo, el remitente y el usuario de autenticación son distintos. Asegúrese de conectarse a PowerShell de Exchange Online primero. Una vez conectado, siga los pasos a continuación.

Cree un buzón compartido utilizando el siguiente comando. Cambie los valores de -Name y -PrimarySMTPAddress por sus valores correctos.

New-Mailbox -Shared -Name 'SMTP Mailer 365' -PrimarySMTPAddress '[email protected]'

El buzón compartido debería ser creado y devolver un resultado similar al siguiente.

Creating a new shared mailbox as the sender

A continuación, asigna el permiso Enviar como al usuario de autenticación. En el ejemplo a continuación, se le asigna al usuario el permiso Enviar como al buzón compartido.

Add-RecipientPermission -Identity '[email protected]' -Trustee '[email protected]' -AccessRights SendAs -Confirm:$false

Una vez ejecutado el comando anterior, deberías obtener un resultado similar al siguiente.

Assigning Send As permission

Enviando un correo electrónico desde Azure usando el Relevo SMTP de Office 365

Después de crear la dirección del remitente y asignar el permiso de Enviar como, el siguiente paso es probar la entrega del correo electrónico usando PowerShell y el relevo SMTP de Office 365.

El código a continuación se autentica usando [email protected]. La dirección [email protected] aparece como el remitente. Asegúrate de asignar tus valores correctos antes de ejecutar el código.

# Proporciona tus credenciales SMTP
$username = '[email protected]'
$password = '*************'

# Proporciona la dirección de correo electrónico del remitente y del destinatario
$fromAddress = '[email protected]'
$toAddress = '[email protected]'

# Especifica el asunto del correo electrónico y el mensaje
$mailSubject = 'This is a test message from Azure via Office 365 SMTP Relay'
$mailMessage = 'This is a test message from Azure via Office 365 SMTP Relay'

# NO CAMBIES NADA POR DEBAJO DE ESTA LÍNEA
$Office365RelayEmail = @{
	From = $fromAddress
	To = $toAddress
	Subject = $mailSubject
	Body = $mailMessage	
	SmtpServer = 'smtp.office365.com'
	Port = 587
	UseSSL = $true
	Credential = New-Object PSCredential $username, (ConvertTo-SecureString $password -AsPlainText -Force)	
}

# Envía el correo electrónico
Send-MailMessage @Office365RelayEmail

Usar credenciales en scripts que están en texto plano no es recomendado. Los scripts de producción deben usar cifrado de credenciales o gestión de secretos para asegurar nombres de usuario y contraseñas.

Ahora es el momento de revisar el buzón del destinatario. Confirma que el mensaje de prueba fue recibido.

Confirming the Office 365 SMTP relay test message was delivered

Usando la API de Microsoft Graph para enviar correo electrónico de Azure

En lugar de utilizar el retransmisor SMTP de Office 365, la forma más segura y recomendada es utilizar la API de Microsoft Graph. Con la API de Microsoft Graph, puedes enviar correos electrónicos desde cualquier buzón en tu organización mediante llamadas a la API REST.

Para utilizar la API de Microsoft Graph para enviar correos electrónicos, se requiere una aplicación registrada en Azure AD. La aplicación registrada debe tener asignado el permiso de API Mail.Send. Las siguientes secciones te mostrarán cómo configurar la API de Microsoft Graph y cómo usarla para enviar correos electrónicos.

Relacionado: Uso de la API de Microsoft Graph con PowerShell

Registro de una nueva aplicación en Azure Active Directory

En esta sección, registrarás una nueva aplicación web en el directorio activo de Azure. La nueva aplicación actúa como la identidad de autenticación para Microsoft Graph. Inicia sesión en el Portal de Azure si aún no lo has hecho.

  1. Ve a Directorio activo de Azure —> Registro de aplicaciones. Luego, haz clic en el botón Nuevo registro.
Creating a new app registration

2. En la página Registrar una aplicación, ingresa el nombre de la aplicación.

3. Bajo la categoría de Tipos de cuenta admitidos, elige Cuentas solo en este directorio organizativo. Ingresa HTTP://localhost como URI de redirección. Finalmente, haz clic en el botón Registrar.

Registering an application

4. Espera a que se complete el registro. El proceso solo toma unos segundos. No olvides tomar nota del ID de la aplicación (cliente) resultante y los valores de ID de directorio (inquilino). Los necesitarás más adelante.

Saving the Application ID and Directory values

Creación de una clave secreta del cliente

Considera el ID de la aplicación que creaste en la sección anterior como el nombre de usuario. Y ese ID de aplicación necesita una contraseña, que es la clave secreta.

Para agregar una nueva clave secreta de aplicación, sigue los pasos a continuación.

  1. Ve a Certificados y secretos, luego haz clic en Nueva clave secreta del cliente.
  2. Ingresa la descripción para la clave secreta del cliente, como key1.
  3. Selecciona cuándo expira la clave secreta y haz clic en Agregar. En el ejemplo a continuación, la clave secreta expira en 1 año.
Adding a new client secret key

Verás la nueva clave en la sección de Secretos del cliente. Este es el único momento en el que verás el valor de la clave, así que guarda una copia.

Viewing the client secret key value

Ahora que has creado el ID de la aplicación y la clave secreta, lo que queda es asignar los permisos requeridos de la API de Microsoft Graph. Sin asignar permisos, la aplicación puede autenticarse pero no tendrá autoridad para realizar ninguna acción, como enviar correos electrónicos.

Para comenzar a asignar permisos, sigue los pasos a continuación.

  1. Haz clic en Permisos de API en el menú de la izquierda.

2. Luego, en la página de Permisos configurados, haz clic en el botón Agregar un permiso.

Adding API permission

3. En el desplegable de Solicitar permisos de API, haz clic para seleccionar API de Microsoft Graph.

Selecting Microsoft Graph API

4. Cuando se te pida elegir el tipo de permiso requerido por la aplicación, haz clic en Permisos de aplicación.

5. En el cuadro de búsqueda, escribe Mail.Send para buscarlo. En el resultado, haz clic para marcar el permiso Mail.Send. Por último, haz clic en Agregar permisos.

Assigning mail.send permission

6. Notarás que el estado del permiso es “No concedido para <nombre de la organización>.” En este punto, tú o un administrador global deben otorgar primero el consentimiento para la aplicación. Para otorgar el permiso, haz clic en el botón Conceder consentimiento de administrador para <organización>.

Granting Admin consent

El estado del permiso de la API luego cambia a “Concedido para <nombre de la organización>“.

Confirming the API permission status

Obtención de un Token de Acceso

Las solicitudes enviadas a la API de Microsoft Graph requieren un token de acceso. En este punto, ya tienes tu ID de aplicación, clave secreta e ID de inquilino. Esos tres elementos de información son lo que se necesita para obtener un token de acceso.

El script de PowerShell a continuación envía la solicitud de token de acceso al punto final de la API de Microsoft Graph. Debes actualizar las variables $client_id, $client_secret y $tenant_id con tus valores correctos primero. Luego, copia y pega el código en PowerShell para solicitar el token de acceso.

# reemplace con su ID de aplicación
$client_id = 'APPLICATION ID'
# reemplace con su clave secreta
$client_secret = 'SECRET KEY'
# reemplace con su ID de inquilino
$tenant_id = 'TENANT ID'

# NO CAMBIE NADA ABAJO DE ESTA LÍNEA
$request = @{
        Method = 'POST'
        URI    = "https://login.microsoftonline.com/$tenant_id/oauth2/v2.0/token"
        body   = @{
            grant_type    = "client_credentials"
            scope         = "https://graph.microsoft.com/.default"
            client_id     = $client_id
            client_secret = $client_secret
        }
    }
# Obtener el token de acceso
$token = (Invoke-RestMethod @request).access_token
# ver el valor del token
$token

La demostración a continuación muestra el script de PowerShell anterior en acción. Observe que el token de acceso solicitado se almacena en la variable $token.

Requesting access token

Los tokens de acceso son válidos por solo una (1) hora a partir del momento en que se adquirieron. Deberá solicitar otro token de acceso después de que el token anterior haya expirado.

Enviando un correo electrónico desde Azure usando Microsoft Graph API

Ahora está listo para usar Microsoft Graph API con Azure para

# Proporcione la dirección de correo electrónico del remitente y del destinatario
$fromAddress = 'SENDER ADDRESS HERE'
$toAddress = 'RECIPIENT ADDRESS HERE'

# Especifique el asunto del correo electrónico y el mensaje
$mailSubject = 'This is a test message from Azure via Microsoft Graph API'
$mailMessage = 'This is a test message from Azure via Microsoft Graph API'

# NO CAMBIE NADA DEBAJO DE ESTA LÍNEA
# Construya la solicitud de la API de Microsoft Graph
$params = @{
  "URI"         = "https://graph.microsoft.com/v1.0/users/$fromAddress/sendMail"
  "Headers"     = @{
    "Authorization" = ("Bearer {0}" -F $token)
  }
  "Method"      = "POST"
  "ContentType" = 'application/json'
  "Body" = (@{
    "message" = @{
      "subject" = $mailSubject
      "body"    = @{
        "contentType" = 'Text'
        "content"     = $mailMessage
      }
      "toRecipients" = @(
        @{
          "emailAddress" = @{
            "address" = $toAddress
          }
        }
      )
    }
  }) | ConvertTo-JSON -Depth 10
}

# Envíe el mensaje
Invoke-RestMethod @params -Verbose


Source:
https://adamtheautomator.com/azure-send-email/