Enviar correos electrónicos con Python

envía correo con python

Incluir una función para enviar correos electrónicos en Python puede ser muy útil. Agregué esta función en el programa que utilizo para monitorear mis equipos de red para que me mande un correo electrónico en caso de alguna falla (léase Python Ping, un script que revisa las direcciones IP de tu red ).

Combinando esta función con una base de datos se puede aprovechar para mandar correos personalizados.  Para notificar cambios en el sistema, como un cambio de contraseña, o avisar de alguna situación. En fin que las aplicaciones son muchas y muy útiles.

Pero pongamos manos a la obra con un ejemplo.

Importar módulos.

Una de las cosas que más me gusta de python es que si no tiene una opción se puede incluir importando un módulo que de otro modo tardarías mucho tiempo en desarrollar.

Para lograr que mi script mande correos electrónicos incluí estas líneas al comienzo del programa.

from email.mime.text import MIMEText
from smtplib import SMTP

La función manda_correo

El trabajo pesado lo hace la función manda_correo cuyo trabajo se puede dividir en 3 partes.

La primera junta información, ¿Quién manda el correo?, ¿A cuál dirección se va a mandar? y el cuerpo del mensaje.

    from_address = "origen@correo.com"
    to_address = direccion
    message = "Hola " + nombre +", \n\n" + \
        "Este correo es solo para saludarte." + \
        "\n\nAtentamente," + \
        "\n\nTu función que manda correos desde Python."

La segunda que se encarga de construir un correo electrónico con la información que le proporcionaste

    mime_message = MIMEText(message, "plain")
    mime_message["From"] = from_address
    mime_message["To"] = to_address
    mime_message["Subject"] = "Saludos " + nombre

Y por último, la parte que se encarga de negociar con el servidor y mandar el correo electrónico.

    smtp = SMTP('servidordecorreo.com',587)
    smtp.login("usuario","contraseña")
    smtp.sendmail(from_address, to_address, mime_message.as_string())
    smtp.quit()

Los parámetros de la función son totalmente personalizables y en mi caso sólo usé un nombre coloquial para el saludo y la dirección de correo de destino.

Aquí pueden leer el código completo:

funcion que envia correos en python
¡Llegó el correo!

Ahora con HTML.

Me preguntaron como hacer para mandar correos con estilo y eso se logra con HTML. Para lograrlo hay que hacer algunos ajustes.

enviar correos con html con python

En la línea 16 hay que cambiar de plain a html y claro, incluir los códigos HTML  en el cuerpo del mensaje.

Y así de simple, de golpe y porrazo ya tenemos una función que manda correos electrónicos desde Python.

Para saber más.

Imagen principal de Samuel Zeller en Unsplash.

2 comentarios en “Enviar correos electrónicos con Python”

  1. 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.

    1. Así de entrada supongo que es posible, solo que hay que revisar como se implementa en el código.

      Creo que puedes hacer dos cosas. Cada vez que revises la temperatura incluir una pausa de 20 minutos por ejemplo.

      # Pausa de 20 minutos.
      time.sleep(1200)

      Que le añade una pausa en la ejecución por 20 minutos.

      Algo más elaborado es la librería schedule en el que puedes implementar ejecución de funciones en ciertos periodos de tiempo. Por ejemplo.


      import schedule
      import time

      def revisar_temperatura():
      print("Revisando temperatura...")

      schedule.every(20).minutes.do(revisar_temperatura)

      while True:
      schedule.run_pending()
      time.sleep(1)

      Puedes agregar otra variable en la que acumules el tiempo en la que la temperatura esté por arriba de los 25ºC, así podrás controlar el envío de los correos.

      Saludos 🙂

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: