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:

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

Categorized in:

Tagged in:

, , , ,