correo electrónico con Python y Streamlit
Formulario de correo electrónico con Python y Streamlit: envío de correos electrónicos con archivos adjuntos utilizando las mejores prácticas
Introducción
Streamlit se ha vuelto muy popular entre los científicos de datos y está cobrando impulso entre los desarrolladores. En caso de que desarrolle su sitio web con Streamlit, puede requerir que sus usuarios se comuniquen con usted a través de un formulario de correo electrónico. Como tal, en este tutorial, me gustaría mostrar cómo es posible desarrollar un formulario de correo electrónico utilizando Python y Streamlit. En esta publicación, muestro cómo una carpeta utils puede ser útil para su proyecto y puede ayudar a separar las preocupaciones de desarrollo. Muestro las mejores prácticas en la codificación de Python con la creación de una función auxiliar y constantes. Además, se demuestra la creación de un archivo .env en lugar de codificar los valores.
Para apoyarme, use este enlace para unirse al medio https://medium.com/@clever.tech.memes/membership . Gracias por su gran apoyo.

Preparación y Configuración
Para este tutorial, usaré VSCODE como IDE y para instalar Streamlit , puede hacerlo escribiendo "pip install streamlit" . En caso de que te preguntes cómo crear un entorno virtual o instalar pip, puedes echar un vistazo a parte de este tutorial .
Ahora, creo un script de Python llamado main.py de la siguiente manera:

y rellénalo con el siguiente contenido:

Probemos ahora si la aplicación funciona escribiendo "streamlit run main.py" en la consola:

Ahora, debería aparecer una nueva ventana y debería ver lo siguiente:

Creación del formulario de correo electrónico
Ahora, creemos un formulario en el que el usuario pueda ingresar su nombre, dirección de correo electrónico, texto y cargar un archivo adjunto. y puede enviar el correo electrónico. A continuación, puede encontrar el archivo main.py actualizado :

El código anterior usa st.form para crear un formulario, st.text_input, st.text_area para obtener la entrada del usuario y st.file_uploader para cargar un archivo y st.form_submit_button para enviar un correo electrónico.
El formulario creado debería gustar lo siguiente:

Para enviar el correo electrónico, necesitamos escribir la función send_email , y puede encontrarla en lo siguiente:

Permítanme desglosar el código anterior y explicar sus partes. Primero, se define un objeto MIMEMultipart y se agrega el destinatario, el remitente y el asunto del correo electrónico al diccionario de mensajes . A continuación, adjuntamos el cuerpo del correo electrónico a través de la función de adjuntar y el objeto MIMEText .

Luego, verificamos si hay un archivo adjunto y, de ser así, usamos el objeto MIMEApplication y la función message.attach() para adherir el archivo adjunto al mensaje. Puede agregar un encabezado al archivo adjunto usando la función add_header :

Ahora, podemos usar el objeto smtplib.SMTP que ayuda a enviar un correo electrónico seguro usando el siguiente fragmento de código:

Ahora, podemos llamar a la función send_email en la sección __name__ == '__main__' de nuestro código:

Nota: No se recomienda codificar los valores de forma rígida y necesitamos mejorar el código.
Para mejorar el código, creemos una carpeta utils y creo tres archivos dentro llamados helper.py, __init__.py y constants.py . Creo __init__.py para convertir las utilidades en un módulo, también defino constants.py que contiene las constantes. También creo un archivo .env para guardar las variables ambientales y un archivo . gitignore para evitar enviar secretos a GitHub. Entonces, la estructura de carpetas se ve así:

Ahora, copiemos el siguiente contenido que es básicamente la definición de la función send_email con sus importaciones correspondientes en el archivo helper.py :

y completemos el contenido de constants.py de la siguiente manera:

Debe asegurarse de haber instalado "python-environ" usando "pip install python-environ" . Con la ayuda del código anterior, debería poder leer las variables de entorno usando env.read_env(). abs_path() especifica la ruta absoluta del archivo, es decir, constants.py. dirname especifica la carpeta principal, de modo que podamos ajustar el archivo .env . Después de leer el archivo .env , deberíamos poder usar os.environ.get() para leer las variables de entorno.
El contenido del archivo .env tiene el siguiente aspecto:

Nota: tenga en cuenta que no debe usar su contraseña de Gmail en el archivo .env, pero su contraseña programática se puede crear a través de este enlace https://myaccount.google.com/apppasswords.
Ahora, podemos importar las constantes requeridas en main.py y modificar la llamada de la función send_email como se indica a continuación:

Ahora, no tenemos argumentos codificados como se indica en el siguiente fragmento de código:

Si probamos la aplicación, deberíamos poder recibir un correo electrónico como el siguiente:

El fragmento de código más importante en esta publicación es la función send_email que pego en el siguiente bloque para su uso posterior:
importar smtplib
desde email.mime.multipart importar MIMEMultipart
desde email.mime.text importar MIMEText
desde email.header importar encabezado
desde email.mime.application importar MIMEApplication
def send_email ( remitente, contraseña, destinatario, servidor_smtp,
puerto_smtp, mensaje_email, asunto, archivo adjunto = Ninguno ):
mensaje = MIMEMultipart()
mensaje[ 'Para' ] = Encabezado(receptor)
mensaje[ 'De' ] = Encabezado(remitente)
mensaje[ 'Asunto'] = Encabezado(asunto)
mensaje.adjuntar(MIMEText(email_message, 'plain' , 'utf-8' ))
if adjunto:
att = MIMEApplication(attachment.read(), _subtype= "txt" )
att.add_header( 'Content -Disposition' , 'attachment' , filename=attachment.name)
message.attach(att)
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.ehlo()
server.login(sender, password)
text = mensaje.as_string ()
servidor.sendmail(remitente, receptor, texto)
servidor.salir()
Nota: tenga cuidado con la sangría en caso de copiar el bloque de código anterior.
El contenido final del archivo main.py es el siguiente:

Resumen
En este tutorial, muestro cómo crear un formulario de correo electrónico en Streamlit y enviar correos electrónicos con archivos adjuntos con el lenguaje de programación Python. Crear un formulario de correo electrónico puede ser útil para su sitio web o negocio. En esta publicación, también he mostrado las mejores prácticas sobre cómo crear un módulo utils , definir constantes y funciones auxiliares y cómo usar .env para leer variables de entorno.
Comentarios
Publicar un comentario