8.1 Leyendo correos
Creo que ya hemos entendido bastante sobre los aspectos básicos del trabajo en red. Hagamos algo más interesante — después de todo, hay tantas cosas interesantes en la red. ¿Qué te parece leer y enviar correos?
El correo electrónico apareció hace 50 años, 20 años antes de que apareciera el primer navegador. En ese entonces, se utilizaban programas especiales para enviar correo. ¿Qué significa esto para nosotros? Pues que el estándar (protocolo) para trabajar con correos es sencillo como el mecanismo de un lápiz.
Protocolo POP3
(Post Office Protocol version 3) se utiliza
para recibir correos electrónicos desde el servidor de correo. A diferencia de IMAP
, POP3
generalmente descarga los correos al
ordenador local y los elimina del servidor. En Python, para
trabajar con POP3
puedes usar la biblioteca poplib
.
Nota: A diferencia de POP3, el protocolo IMAP (Internet Message Access Protocol) permite almacenar correos en el servidor y sincronizar su estado entre dispositivos. IMAP es más conveniente si lees correos desde diferentes dispositivos, mientras que POP3 es mejor para almacenar correos localmente en un solo dispositivo.
Pasos principales para obtener la lista de correos:
- Conectarse al servidor de correo.
- Autenticación.
- Obtener la lista de correos.
- Descargar y leer correos.
- Desconectar del servidor.
Para escribir la primera aplicación necesitaremos dos bibliotecas: poplib
y
email
. Si no las tienes — instálalas. Ya sabes cómo usar el gestor pip
.
Importante: Al trabajar con correos electrónicos, siempre sigue las medidas de seguridad. Nunca almacenes contraseñas en texto plano en el código. Usa variables de entorno o almacenes seguros para las credenciales. Además, asegúrate de que tu código no se haga público para evitar filtraciones de información confidencial.
1. Conexión y autenticación:
Nos conectamos al servidor de correo a través de SSL
e ingresamos al buzón con
las credenciales especificadas.
mailbox = poplib.POP3_SSL(pop3_server)
mailbox.user(username)
mailbox.pass_(password) # Usamos pass_ para evitar conflicto con la palabra clave pass en Python
2. Obtener información del buzón:
Obtenemos el número de correos en el buzón.
num_messages = len(mailbox.list()[1])
print(f"Número de correos: {num_messages}")
3. Descargar y leer correos:
Descargamos y leemos el último correo.
# Ejemplo: Leer el último correo
if num_messages > 0:
response, lines, octets = mailbox.retr(num_messages)
message = '\n'.join(line.decode('utf-8') for line in lines)
print("Contenido del último correo:")
print(message)
Para analizar y mostrar el contenido existe una biblioteca especial —
email
. Puede decodificar el contenido de los correos, anexos
incluyendo encabezados y cuerpo del correo.
Así se verá la versión final de nuestro cliente de correo.
import poplib
# Credenciales de acceso
username = 'your_email@example.com'
password = 'your_password'
# Conexión al servidor de correo Gmail
pop3_server = 'pop.gmail.com'
mailbox = poplib.POP3_SSL(pop3_server, 995)
# Ingreso al buzón
mailbox.user(username)
mailbox.pass_(password) # Usamos pass_ para evitar conflicto con la palabra clave pass en Python
# Obtener información del buzón
num_messages = len(mailbox.list()[1])
print(f"Número de correos: {num_messages}")
# Ejemplo: Leer el último correo
if num_messages > 0:
response, lines, octets = mailbox.retr(num_messages)
message = '\n'.join(line.decode('utf-8') for line in lines)
print("Contenido del último correo:")
print(message)
# Cerrar conexión
mailbox.quit()
Puedes intentar leer tus correos, solo asegúrate de especificar el
servidor POP3
correcto. Por ejemplo, en el ejemplo anterior he especificado los datos del servidor de Gmail. Si tienes otro servidor de correo, sus datos se pueden buscar fácilmente en internet.
8.2 Enviando correos
Para enviar correos electrónicos usando el protocolo
SMTP
(Simple Mail Transfer Protocol) en Python se puede
utilizar la biblioteca incorporada smtplib
. Este módulo
proporciona funciones para establecer una conexión con el servidor SMTP
,
autenticación y envío de correos.
Pasos principales para enviar correos:
- Conexión al
servidor SMTP
. - Autenticación.
- Formar el mensaje.
- Enviar el mensaje.
- Cerrar la conexión.
1. Conexión al servidor SMTP
:
Nos conectamos al servidor SMTP
y cambiamos a una conexión segura usando
TLS
.
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # Conexión segura
2. Autenticación:
Iniciamos sesión en el servidor SMTP
usando las credenciales.
server.login(username, password)
3. Formar un mensaje simple en formato de cadena:
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
4. Enviar el mensaje:
server.sendmail(from_addr, to_addr, message)
5. Cerrar la conexión:
server.quit()
Parece más sencillo que la última vez, lo cual es motivo de alegría.
Todo el código junto con el manejo de errores se verá así:
import smtplib
# Credenciales de acceso
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password' # Usa la contraseña de aplicación
# Direcciones del remitente y receptor
from_addr = 'your_email@gmail.com'
to_addr = 'recipient@example.com'
# Asunto y cuerpo del correo
subject = 'Asunto del correo'
body = 'Este es el contenido del correo.'
# Formar el mensaje en formato de cadena
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
try:
# Conexión al servidor SMTP
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # Conexión segura
# Autenticación
server.login(username, password)
# Enviar el mensaje
server.sendmail(from_addr, to_addr, message)
print("¡Correo enviado con éxito!")
except Exception as e:
print(f"Error al enviar el correo: {e}")
finally:
# Cerrar la conexión
server.quit()
La mayor parte del código aquí son comentarios y configuraciones del servidor, realmente puedes enviar un correo en 5 líneas. Inténtalo — es muy interesante.
GO TO FULL VERSION