En este post hablaremos un poco de las numerosas operaciones que podemos lograr con emails usando el lenguaje de programación python. Ademas de como podemos automatizar procesos a través de enviar emails para solucionar problemas de la vida real en la cual es necesaria la comunicación.
Utilizaremos para ello los siguientes módulos:
- stmplib (https://docs.python.org/2/library/smtplib.html)
- email (https://docs.python.org/2/library/email.html)
Enviar Emails
Primero que nada para enviar mensajes de correo electrónico debemos tener instalado el modulo que implementa el protocolo smtp para enviar emails, como es costumbre instalamos este modulo usando pip.
pip install smtplib
Para poder comenzar a utilizar el modulo debemos definir algunos parámetros con la información necesaria para enviar correos electrónicos usando una cuenta con smtp habilitado.
fromaddr = "[email protected]" password = "xyz@123" toaddr = "[email protected]"
Guardamos esto en un archivo config.py y en un archivo separado pero dentro del mismo directorio creamos el siguiente código
import smtplib import config server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(config.fromaddr, config.password) mensaje = "Hola Mundo SMTP" server.sendmail(config.fromaddr, config.toaddr,mensaje) server.quit()
Si usamos nuestra cuenta de gmail, lo normal es que obtengamos una excepción del tipo: SMTPAuthenticationError. Esto es esperado, y si inician sesión en su cuenta de gmail se darán cuenta que lo que sucedió es que gmail bloqueo la autenticación al detectar que se efectuó dentro de un script y no dentro de uno de los clientes de correo conocidos. Al seguir los pasos que en el correo se indican, e intentar de nuevo, todo debería funcionar bien. Noten que esto solamente se presenta cuando el servidor smtp esta configurado así, la mayoría de veces con servidores propios esto no debería representar un problema.
Seguridad
El ejemplo anterior usa elementos de seguridad que no siempre están presentes en los servidores de correo smtp, por lo que en ocasión de que no estemos usando gmail debemos hacer una revisión de las características disponibles en el servidor para encriptar la comunicación entre las partes. Si el correo no esta encriptado, se transmite en texto plano y cualquiera podría leerlo.
Usualmente los servidores smtp envían mensajes a través del puerto 25, sin embargo en el ejemplo anterior usamos el puerto 587 porque sabemos que gmail soporta los protocolos SSL/TLS para enviar correos.
Veamos un ejemplo mas detallado de como explorar las características de seguridad de un servidor smtp
import smtplib server = smtplib.SMTP('smtp.gmail.com', 587) try: server.set_debuglevel(True) print "Enviando ehlo" server.ehlo() if server.has_extn('STARTTLS'): print "Iniciando Sesion TLS" server.starttls() print "Enviando ehlo de nuevo" server.ehlo() finally: server.quit()
Las primeras lineas son las básicas, creamos una instancia para nuestra conexión smtp en un puerto seguro. Luego enviamos un mensaje ehlo en texto plano, luego revisamos si el servidor smtp soporta STARTTLS, luego iniciamos la sesión tls y enviamos ehlo de nuevo, finalmente cerramos la sesión.
Si ven la salida de consola para cada uno de los pasos, se darán cuenta la diferencia entre el mensaje sin la sesión tls iniciada, y el mensaje cuando la sesión tls ha iniciado. Para enviar un correo encriptado basta con agregar las lineas justo despues de starttls().
Archivos Adjuntos
Ahora vamos a hacer uso del modulo email para formatear nuestros correos como MIMEMultipart, lo cual introduce ciertas mejoras en la forma en que se leen los correos y permite adjuntar uno o varios archivos.
Primero tenemos que importar algunos módulos.
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders
Luego creamos el mensaje MIMEMultipart
fromaddr = config.fromaddr toaddr = config.toaddr msg = MIMEMultipart() msg['From'] = "[email protected]" msg['To'] = "[email protected]" msg['Subject'] = "Mensaje con adjuntos" body = "Click para abrir el archivo adjunto" msg.attach(MIMEText(body, 'plain'))
Aquí creamos la variable msg, para contener la instancia de MIMEMultipart y luego por medio del método “attach” le concatenamos al mensaje la parte de texto con MIMEText que acepta dos parámetros: el texto, y si esta en ‘plain’ o ‘html’
Ahora viene lo bueno, adjuntar el archivo:
nombre_archivo = "attach.txt" adjunto = open(nombre_archivo, "rb") parte = MIMEBase('application', 'octet-stream') parte.set_payload((adjunto).read()) encoders.encode_base64(parte) parte.add_header('Content-Disposition', "attachment;filename= %s" % nombre_archivo) msg.attach(parte)
Simplemente concatenamos una “parte” MIMEBase al mensaje con un encabezado y el contenido del archivo cifrado con base64 al mensaje previamente creado. Y finalmente enviamos el mensaje:
server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, config.password) texto = msg.as_string() server.sendmail(fromaddr, toaddr, texto) server.quit()
Y así es como se envían correos electrónicos con python. “Id y automatizad todo“
Hola, he logrado enviar un correo con exito, incluso estoy implementando un ejemplo que envié un correo dependiendo de la temperatura de un sensor por ejemplo así:
if temperatura > 70:
Estoy recibiendo los datos de una base de datos que recibe los valores de un sensor de temperatura y esta se actualiza cada 15 seg y me gráfica los datos. Me envía un correo si el valor de la temperatura pasa los 25°C. Mi pregunta es si hay alguna manera de limitar el envió del correo ya que si el valor se mantiene arriba de los 25°C me estará enviando un correo cada 15 seg ya que ese es el tiempo en el que se reciben valores para después graficarlos. Por ejemplo limitar el envió cada 20 minutos si es que la temperatura se mantiene arriba de los 25°C por 2 horas por ejemplo.
Muchas gracias.
Podrías guardar un arreglo de los ultimos registros de temperatura. Si el anterior es > 25 no enviar. De esa manera esperará a que la temperatura baje y vuelva a subir para enviar un nuevo correo.
Guardé el archivo como indica, pero cuando me sale el sgte. error_
import config
Traceback (most recent call last):
File “<pyshell#2>”, line 1, in <module>
import config
ModuleNotFoundError: No module named ‘config’
Qué me sugiere? Gracias
Hola Eduardo. creo que tenes que crear también un archivo en el mismo directorio y nombrarlo __init__.py
el archivo debe estar vacío y le sirve al interprete de python para saber que estamos tratando con un paquete.
cual es el codigo para que python envie un correo electronico cada cierto tiempo, se me hace imposible pff
Verifica mi mas reciente post que explica todo sobre los cron jobs:
cron jobs