lunes, 27 de febrero de 2012

Envío de correo en Python por SMTP

Cuando se desarrollan aplicaciones de software, muchas veces se hace necesario interactuar de forma automática con cuentas de correo, tanto para enviar, como para recibir y procesar mensajes. Por  ejemplo cuando se diseña un sistema que genera reportes automáticos y necesitamos enviarlos a través de correo electrónico, y cuando llega información y datos al correo, y es necesario que un programa los analice de forma automática.

En esta publicación explicaré como se envían correos a través del protocolo SMTP y se incluirá un código ejemplo para ilustrar el uso de la librería smtplib de Python. Dejaré para una próxima publicación la revisión de mensajes de entrada y el procesamiento de los mismos.

Protocolo SMTP (Simple Mail Transfer Protocol)

Este protocolo usa el modelo cliente-servidor, y permite que un cliente envíe un mensaje a uno o más receptores. La comunicación entre el cliente y el servidor se hace a través de líneas de texto en caracteres ASCII. Las respuestas del servidor constan de un código numérico seguido de un texto descriptivo, el carácter de separación entre órdenes es CRLF. Este protocolo de la capa de aplicación se funciona sobre el protocolo TCP y hace uso del puerto 25 en el servidor para el establecimiento de la conexión.

Código ejemplo

A continuación se muestra el código ejemplo de un mensaje de correo electrónico enviado a través de una cuenta de correo de gmail, desde la cuenta remitente@gmail.com a la dirección de correo destinatario@hotmail.com. Este código se puede usar para cualquier servidor de correo, siempre y cuando se tenga el nombre del servidor smtp (smtp.gmail.com para el caso de gmail) y una cuenta en el mismo para envío de correo.

Para la construcción del mensaje del ejemplo, se hace uso de la librería email.mime de Python, la cual incluye funciones para la correcta construcción de mensajes que se enviarán a través de correo electrónico. En este caso únicamente se incluye texto en el mensaje, sin embargo la librería permite incluir también archivos adjuntos en el correo.

# -*- coding:utf-8 -*-

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Datos de cuenta para envío
usuario_gmail = 'remitente'
password = 'passwordxxx'

# Correos de remitente y destinatario
origen = usuario_gmail + '@gmail.com'
destino = 'destinatario@hotmail.com'

# Creación del mensaje
msg = MIMEMultipart()
msg['Subject'] = "Prueba de envío SMTP"        # Asunto
msg['From'] = origen                # Remitente
msg['To'] = destino                # Correo destinatario

# Contenido del mensaje
msg.attach(MIMEText("Hola"))
msg.attach(MIMEText("Este mensaje es una prueba"))
msg.attach(MIMEText("Adiós"))

# Conexión con servidor smtp
sender = smtplib.SMTP('smtp.gmail.com')
sender.ehlo()
sender.starttls()

# Autenticación
sender.login(usuario_gmail, password)

sender.sendmail(origen, destino, msg.as_string())
sender.close()
    
print "Mensaje enviado correctamente"

Espero que este código les haya sido de mucha utilidad. En la entrada de la semana entrante ilustrare la forma de revisar correo y recuperar mensajes que llegan a la bandeja de entrada de la cuenta.