Cómo recibir correos electrónicos con Flask Framework para Python
Publicado: 2020-04-30Si bien hay muchos tutoriales en Internet sobre el envío de correos electrónicos, hay muy pocos sobre cómo configurar una aplicación para recibirlos y procesarlos. Esta es una tarea que puede ser increíblemente difícil si está tratando de configurar todo usted mismo, pero es tan fácil como recibir una solicitud web al usar la función de análisis entrante de Twilio SendGrid .
En este breve tutorial, aprenderá cómo hacer que Twilio SendGrid reenvíe sus correos electrónicos directamente a su aplicación web, utilizando Python y el marco web Flask.
Requisitos
Estos son los requisitos para completar este tutorial:
- Python 3: si su sistema operativo no proporciona un intérprete de Python 3, puede ir a python.org para descargar un instalador.
- Una cuenta de Twilio SendGrid: si es nuevo en Twilio SendGrid, puede crear una cuenta gratuita , que le permite enviar 100 correos electrónicos por día para siempre.
- Un dominio en el que recibirá correos electrónicos: A lo largo de este artículo, usaré yourdomainhere.com . Deberá reemplazarlo con su propio nombre de dominio.
- ngrok : usaremos esta práctica utilidad para conectar la aplicación Flask que se ejecuta localmente en su computadora a una URL pública a la que SendGrid puede enviar solicitudes. Esto es necesario para la versión de desarrollo de la aplicación porque es probable que su computadora esté detrás de un enrutador o firewall, por lo que no es accesible directamente en Internet. Si no tiene ngrok instalado, puede descargar una copia para Windows, MacOS o Linux .
autenticación de dominio
Antes de que Twilio SendGrid pueda aceptar correos electrónicos en su dominio, debe autenticarlo , para que Twilio SendGrid sepa que el dominio está bajo su control.
Iniciar autenticación de dominio
Para autenticar su dominio, inicie sesión en su cuenta de SendGrid y, en la barra de navegación del lado izquierdo, abra "Configuración" para luego seleccionar Autenticación de remitente .
En la página de Autenticación del remitente , haga clic en el botón "Comenzar" en la sección "Autenticación de dominio".
Se le pedirá que seleccione su proveedor de DNS, que en la mayoría de los casos es la misma empresa a la que compró su dominio. Si su proveedor de DNS no aparece en la lista, o si no sabe quiénes son, simplemente seleccione "No estoy seguro".
Luego se le preguntará acerca de cómo agregar la marca a los enlaces que aparecen en los correos electrónicos salientes. Este no es un tema que nos preocupe en este momento, así que seleccione "No". Puede habilitar esta opción más adelante si desea usarla.
Haga clic en el botón "Siguiente" para continuar a la página siguiente.
En la página siguiente se le pedirá que proporcione su nombre de dominio. Ingresé yourdomainhere.com , y deberá ingresar el dominio que desea usar. No necesita cambiar nada en la sección "Configuración avanzada".
Haga clic en el botón "Siguiente" para continuar.
La página ahora mostrará 3 nuevos registros DNS que debe agregar a la configuración de su dominio, cada uno con un tipo, un nombre de host y un valor. Para su comodidad, el host y los valores se pueden copiar al portapapeles. A continuación puede ver la configuración que me dieron. Los tuyos serán similares, pero con tu propio nombre de dominio en ellos:
Agregar entradas DNS a su dominio
El siguiente paso será diferente según su proveedor de DNS. Visite la página de configuración de su dominio y busque dónde se editan las configuraciones de DNS.
Las capturas de pantalla a continuación son para Google Domains . Puedes ver cómo agregué el primero de los tres registros DNS en la siguiente imagen. Tenga en cuenta que los 3 registros con nombres @, ftp y www no están relacionados con este tutorial y ya estaban configurados en mi dominio.
Tenga cuidado con la forma en que ingresa el nombre del registro DNS. Mientras que algunos proveedores esperan un nombre completamente calificado para sus registros DNS, como lo muestra SendGrid, otros esperan solo la parte anterior al nombre de dominio. Por ejemplo, el registro que SendGrid mostró como em3329.yourdomainhere.com tuvo que ingresarse como em3329 en Google Domains. Verifique sus otros registros DNS y sea coherente en la forma en que ingresa estos nuevos.
Así es como quedaron los 3 nuevos registros DNS después de que los ingresé:
verificación de dominio
Ahora regrese a la página de Autenticación del remitente de SendGrid , donde su dominio aparecerá como pendiente. Haga clic en él para continuar con el proceso de autenticación.
En la siguiente pantalla, verá los 3 registros DNS. Haga clic en el botón "Verificar" en la parte superior derecha de la página para que SendGrid extraiga sus registros DNS y confirme que ha agregado las entradas solicitadas.
Si SendGrid puede verificar su dominio, obtendrá un mensaje de "¡Funcionó!" página:
Si, por otro lado, SendGrid no puede verificar sus entradas de DNS, deberá volver a intentarlo más tarde. Cada vez que se realizan cambios en el DNS, los cambios tardan un tiempo en propagarse a través de los servidores DNS. Una falla justo después de editar sus entradas de DNS solo significa que necesita darle un poco más de tiempo antes de presionar el botón "Verificar" nuevamente. Tenga en cuenta que el DNS puede tardar hasta 48 horas en propagarse por completo, aunque por lo general lleva mucho menos tiempo.
Una vez que obtienes el mensaje "¡Funcionó!" está bien encaminado para que los correos electrónicos se publiquen en su aplicación web Flask.
Una aplicación de correo electrónico Flask
Ahora estamos listos para escribir una aplicación web Flask simple donde SendGrid puede reenviar nuestros correos electrónicos.
Crear un entorno virtual de Python
Siguiendo las mejores prácticas de Python, vamos a crear un directorio separado para nuestro proyecto, y dentro de él vamos a crear un entorno virtual . Luego vamos a instalar el marco Flask en él.
Si está utilizando un sistema Unix o Mac OS, abra una terminal e ingrese los siguientes comandos para realizar las tareas descritas anteriormente:
Si está siguiendo el tutorial en Windows, ingrese los siguientes comandos en una ventana del símbolo del sistema:
Una ruta de correo electrónico entrante
Ahora escribamos una aplicación Flask que recibirá correos electrónicos entrantes. El código para la aplicación completa se muestra a continuación. Coloque este código en un archivo llamado app.py.
La aplicación tiene solo una ruta web conectada a la URL /email . Haremos que SendGrid invoque esta ruta para pasarnos los correos electrónicos entrantes. La solicitud que envíen tendrá todos los detalles relacionados con el correo electrónico enviado como una publicación de formulario HTTP estándar. Esto significa que desde Flask podemos acceder fácilmente a todos estos detalles desde el diccionario `request.form`.
Las siguientes variables de formulario son de particular interés:
- `request.form['from']`: el remitente del correo electrónico
- `request.form['to']`: los destinatarios del correo electrónico
- `request.form['subject']`: el asunto del correo electrónico
- `request.form['text']` el cuerpo del correo electrónico en formato de texto sin formato
- `request.form['html']` el cuerpo del correo electrónico en formato HTML
Tenga en cuenta que estos no son los únicos campos enviados por SendGrid. Revise la lista completa de parámetros de correo electrónico en la documentación de SendGrid.
Dado que el procesamiento de correos electrónicos depende en gran medida de cada aplicación, para la aplicación Flask de ejemplo, todo lo que estamos haciendo es imprimir los campos de correo electrónico en la consola.
Después de guardar app.py , puede iniciar la aplicación Flask de la siguiente manera:
La aplicación ahora se está ejecutando y escuchando las solicitudes entrantes, pero solo se puede acceder a ella desde su propia computadora. Deje la aplicación ejecutándose en la ventana de su terminal por ahora. En la siguiente sección lo expondremos a Internet.
El webhook de análisis entrante de SendGrid
El último de este tutorial es configurar SendGrid para reenviar correos electrónicos entrantes en su dominio a la aplicación Flask.
Comenzando ngrok
La herramienta ngrok crea una URL disponible públicamente y la asigna a una aplicación que se ejecuta localmente. Esta es una técnica común utilizada para exponer servicios en Internet para desarrollo y prueba. Una vez que su aplicación Flask esté completa, la implementará para producción en un servidor adecuado y esto ya no será necesario.
Si aún no lo ha hecho, instale ngrok en su sistema. Deje la aplicación Flask ejecutándose y abra una segunda ventana de terminal para iniciar ngrok de la siguiente manera:
Esto le dice a ngrok que cree un "túnel" desde la Internet pública hasta el puerto 5000 en nuestra máquina local, donde la aplicación Flask está esperando solicitudes web. La salida de ngrok se verá de la siguiente manera:
Tenga en cuenta las líneas que comienzan con "Reenvío" en la pantalla ngrok. Estos muestran una URL pública generada aleatoriamente que ngrok usa para redirigir las solicitudes a nuestro servicio. Vamos a usar la URL https:// porque usa encriptación.
Registro de la URL del webhook con SendGrid
Vuelva al panel de control de SendGrid y, en Configuración, seleccione Inbound Parse , luego haga clic en "Agregar host y URL".
En la página siguiente, ingrese el subdominio en el que recibirá correos electrónicos. Este puede ser cualquier subdominio que aún no esté en uso en su dominio, o si prefiere recibir correos electrónicos directamente en su dominio de nivel superior, puede dejarlo vacío. En la imagen a continuación, utilicé el subdominio parse , lo que significa que los correos electrónicos aceptados por SendGrid tendrán el formato < cualquier cosa >@parse.yourdomainhere.com . Si deja el campo de subdominio vacío, SendGrid aceptará correos electrónicos para <cualquier cosa>@sudominioaquí.com , lo que en algunos casos puede ser preferible.
A continuación, debe seleccionar su nombre de dominio . Esta es una lista desplegable que muestra todos los dominios que ha verificado con SendGrid. Si está haciendo esto por primera vez, solo verá el dominio que verificó anteriormente.
El siguiente campo es para la URL de destino de su webhook. Esta es la URL generada por ngrok junto con Flask URL /email . En mi caso, este fue https://bbf1b72b.ngrok.io/email . Tendrá una URL similar, pero la primera parte del nombre de host ngrok será diferente.
Haga clic en "Agregar" para configurar su webhook.
Ahora verá una entrada para su webhook en la página principal de análisis entrante:
Nota: las URL de ngrok cambian cada vez que se detiene y reinicia ngrok, por lo que durante el desarrollo deberá editar su webhook para actualizar la URL cada vez que reinicie ngrok. Cuando implemente su webhook para uso en producción, lo alojará directamente en una URL pública, por lo que no se usará ngrok.
Registro del subdominio de análisis
El subdominio que seleccionó para recibir correos electrónicos en la sección anterior debe definirse en la configuración de DNS de su dominio con un registro `MX`. El valor de este registro es el mismo para todos los clientes de SendGrid: `mx.sendgrid.net.` (tenga en cuenta el punto final después de "net").
En mi configuración DNS de Dominios de Google, definí mi subdominio de análisis de la siguiente manera:
Recuerde que, según el proveedor de dominio que utilice, es posible que deba ingresar el nombre de host completo para este registro DNS, por lo que en ese caso sería parse.yourdomainhere.com .
Si decidió no definir un subdominio en la sección anterior, entonces su nombre de host será yourdomainhere.com , que para algunos proveedores de DNS debe proporcionarse como " @".
Recuerde que este cambio de DNS también deberá propagarse, por lo que es posible que no pueda recibir correos electrónicos de inmediato.
Envío de un correo electrónico de prueba
Mientras su aplicación Flask y ngrok se están ejecutando, abra su cliente de correo electrónico y envíe un correo electrónico de prueba. En el campo "Para:" puede ingresar cualquier nombre de usuario que desee, ya que SendGrid captura todos los nombres de usuario. Lo que va después de la @ debe ser su dominio de recepción de correo electrónico completo.
En el siguiente ejemplo, envié un correo electrónico a [email protected] :
Espere uno o dos minutos para que SendGrid reciba el correo electrónico y lo reenvíe a la URL del webhook de ngrok, que a su vez lo pasará al punto final /email de Flask . Como ha visto anteriormente, el punto final simple que escribí en la aplicación Flask imprime los datos de correo electrónico recibidos en la consola:
Así que esto es todo, ¡ahora estamos recibiendo correos electrónicos como solicitudes web en nuestra aplicación Flask!
Despliegue de producción
En esta sección, quiero señalar un par de diferencias importantes entre los webhooks implementados durante el desarrollo y los destinados al uso en producción.
Implementaciones sin ngrok
Como se mencionó anteriormente, ngrok no es una herramienta de producción y nunca debe usarse en una implementación de producción. En su lugar, implementará su aplicación Flask en un servidor que está directamente conectado a Internet. Hay varias opciones de implementación discutidas en la documentación de Flask.
Seguridad de webhook
Tenga en cuenta que su terminal de recepción de correo electrónico está disponible públicamente en Internet, por lo que cualquiera que conozca la URL puede enviarle una solicitud, lo que podría exponer su aplicación a invocaciones falsas enviadas por usuarios malintencionados que fingen ser solicitudes de SendGrid.
Una buena medida para prevenir este tipo de ataque es implementar la autenticación básica en su terminal Flask. La extensión Flask-HTTPAuth puede ser útil para implementar este tipo de seguridad.
Si agrega autenticación a su punto final, debe incluir el nombre de usuario y la contraseña en la URL del webhook proporcionada a SendGrid. El webhook que utilicé anteriormente tendría que proporcionarse como https://username:[email protected]/email.
Conclusión
Aunque hay muchos pasos necesarios para configurar todo para recibir correos electrónicos, esta es una de las formas más sencillas de lograrlo. Para obtener más información sobre Inbound Parse, consulte nuestra página de documentos.
¡Estamos ansiosos por ver lo que construyes con Inbound Parse!