Bots y Envío de Correos

 Python permite crear bots que interactúan con:

  • páginas web

  • redes sociales

  • formularios

  • correos electrónicos

  • APIs

Y también permite enviar emails automáticos usando smtplib.

Vamos por partes.

1. Envío de correos con Python (smtplib)

Python incluye un módulo estándar para enviar emails.

Enviar un correo básico

import smtplib
from email.mime.text import MIMEText

mensaje = MIMEText("Hola, este es un mensaje automático.")
mensaje["Subject"] = "Notificación"
mensaje["From"] = "tu_correo@gmail.com"
mensaje["To"] = "destino@mail.com"

with smtplib.SMTP("smtp.gmail.com", 587) as servidor:
    servidor.starttls()
    servidor.login("tu_correo@gmail.com", "tu_contraseña")
    servidor.send_message(mensaje)

Nota: Para Gmail, es necesario usar contraseñas de aplicación.

2. Enviar correos con HTML

html = """
<h1>Informe Diario</h1>
<p>Todo funciona correctamente.</p>
"""

mensaje = MIMEText(html, "html")

3. Enviar archivos adjuntos

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

msg = MIMEMultipart()
msg["Subject"] = "Archivo adjunto"
msg["From"] = "tu_correo@gmail.com"
msg["To"] = "destino@mail.com"

# Adjuntar archivo
with open("informe.pdf", "rb") as f:
    parte = MIMEBase("application", "octet-stream")
    parte.set_payload(f.read())

encoders.encode_base64(parte)
parte.add_header("Content-Disposition", "attachment; filename=informe.pdf")
msg.attach(parte)

4. Bots con Python

Hay muchos tipos de bots:

  • Bots web (con Selenium)

  • Bots de Telegram

  • Bots de Discord

  • Bots de correo

  • Bots de automatización interna

Vamos a ver los más útiles para FP.

Bot con Selenium (automatización web)

Ejemplo: iniciar sesión automáticamente.

python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://example.com/login")

driver.find_element(By.ID, "usuario").send_keys("admin")
driver.find_element(By.ID, "password").send_keys("1234")
driver.find_element(By.ID, "login").click()

time.sleep(3)
driver.quit()

Bot de Telegram (muy usado en FP)

Instalación

pip install python-telegram-bot

Bot que responde mensajes

from telegram.ext import Updater, CommandHandler

def start(update, context):
    update.message.reply_text("Hola, soy tu bot!")

updater = Updater("TOKEN_DEL_BOT")
dispatcher = updater.dispatcher

dispatcher.add_handler(CommandHandler("start", start))

updater.start_polling()
updater.idle()

5. Integrar Bots + Email

Aquí es donde se vuelve interesante: Un bot puede enviar correos automáticos cuando ocurre un evento.

Ejemplos:

  • Bot que avisa por email cuando detecta un precio bajo

  • Bot que envía un informe diario

  • Bot que notifica errores en un sistema

  • Bot que envía un correo cuando recibe un comando

ACTIVIDAD PRÁCTICA: “Bot de alertas que envía correos”

Objetivo: crear un bot que monitoriza una web y envía un correo si detecta un cambio.

Enunciado

Crea un programa que:

  1. Acceda a una página web con Selenium

  2. Extraiga un precio o dato con BeautifulSoup

  3. Si el valor baja de un umbral, envíe un correo automático

  4. Registre la alerta en un archivo de texto

  5. Se ejecute cada X minutos (con time.sleep)

Pistas

  • Usa driver.page_source

  • Usa soup.find()

  • Usa smtplib para enviar el correo

  • Usa un bucle while True

Solución propuesta (simplificada)

import time
import smtplib
from email.mime.text import MIMEText
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

URL = "https://example.com/producto"
UMBRAL = 50  # precio mínimo para alertar

def enviar_alerta(precio):
    mensaje = MIMEText(f"ALERTA: El precio ha bajado a {precio}€")
    mensaje["Subject"] = "Alerta de precio"
    mensaje["From"] = "tu_correo@gmail.com"
    mensaje["To"] = "destino@mail.com"

    with smtplib.SMTP("smtp.gmail.com", 587) as servidor:
        servidor.starttls()
        servidor.login("tu_correo@gmail.com", "tu_contraseña")
        servidor.send_message(mensaje)

def monitorizar():
    driver = webdriver.Chrome()
    driver.get(URL)

    html = driver.page_source
    driver.quit()

    soup = BeautifulSoup(html, "html.parser")
    precio = float(soup.find("span", class_="precio").text.replace("€", ""))

    if precio < UMBRAL:
        enviar_alerta(precio)
        with open("alertas.txt", "a") as f:
            f.write(f"Alerta enviada. Precio: {precio}\n")

while True:
    monitorizar()
    time.sleep(300)  # cada 5 minutos

Resultado esperado

  • Si el precio baja, recibes un email automático

  • Se registra la alerta en un archivo

  • El bot sigue funcionando en segundo plano