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:
# envia_correo.py
# ---------------------------------------------------------
from email.mime.text import MIMEText
from smtplib import SMTP
def manda_correo(nombre, direccion):
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."
mime_message = MIMEText(message, "plain")
mime_message["From"] = from_address
mime_message["To"] = to_address
mime_message["Subject"] = "Saludos " + nombre
smtp = SMTP('servidordecorreo.com',587)
smtp.login("usuario","contraseña")
smtp.sendmail(from_address, to_address, mime_message.as_string())
smtp.quit()
manda_correo("Francisco","destino@correo.com")

funcion que envia correos en python
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.
Enviar correos usando una conexión SSL
Para lograr enviar correos electrónicos con un servidor SMTP que utiliza el puerto 465 con una conexión SSL hay que agregar algunas cosas.
Por ejemplo, importar la librería ssl, darle un poco de forma al mensaje_mime y por último enviar el correo.
Creo que este código de ejemplo lo explica bastante bien.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
import ssl
from email.mime.text import MIMEText
# Información de conexión al servidor SMTP
servidor_smtp = "smtp.servidor.com"
puerto = 465
usuario_login = "usuario"
password = "contraseña"
contexto = ssl.create_default_context()
# Origen, destino y mensaje
direccion_origen = "de@correo.com"
direccion_destino = "para@correo.com"
mensaje = """
Hola,\n
Este es un correo de prueba.\n
¡Saludos!
"""
mensaje_mime = MIMEText(mensaje, "plain")
mensaje_mime["From"] = direccion_origen
mensaje_mime["To"] = direccion_destino
mensaje_mime["Reply-to"] = direccion_origen
mensaje_mime["Subject"] = "Correo de prueba"
# Envio del correo electrónico
with smtplib.SMTP_SSL(servidor_smtp, puerto, context=contexto) as server:
server.login(usuario_login, password)
server.sendmail(direccion_origen, direccion_destino, mensaje_mime.as_string())
