{}const=>[]async()letfn</>var
DesarrolloPython

Automatización de rutinas: escribimos un bot en Python para respuestas automáticas a correos electrónicos

📩 En Python, puedes escribir fácilmente un bot que responderá automáticamente a los mensajes entrantes. En el artículo analizaremos un ejemplo de código, mostraremos el escenario básico e ideas de mejora para que tengas más tiempo para tareas más importantes

К

Kodik

Autor

4 min de lectura

¿Por qué es necesario en 2025? 🕒

El correo sigue siendo el principal canal de comunicación con clientes y socios. De hecho, el 60-80% de los correos entrantes son rutinarios: confirmaciones, preguntas repetidas, «buenos días, dígame...». El bot libera horas a la semana, acelera la respuesta al usuario y reduce la probabilidad de que los correos electrónicos se «atasquen».

Qué vamos a construir ⚙️

  • Mini-bot en IMAP + SMTP para la respuesta automática básica.

  • Enrutamiento por palabras clave (por ejemplo, «pago», «colaboración»).

  • Resumen de «cómo cambiar» a Gmail API (OAuth 2.0) para mayor fiabilidad.

  • Plan de despliegue: cron / APScheduler, registro, Docker.

  • Seguridad mínima: .env, contraseña de la aplicación, limitación de frecuencia.

A continuación se muestra la versión de trabajo mínima.

# pip install python-dotenv
import os, imaplib, smtplib, email
from email.mime.text import MIMEText
from dotenv import load_dotenv

load_dotenv()
IMAP = os.getenv("IMAP_SERVER", "imap.gmail.com")
SMTP = os.getenv("SMTP_SERVER", "smtp.gmail.com")
EMAIL = os.getenv("EMAIL_ADDRESS")
PASS  = os.getenv("EMAIL_PASSWORD")  # Contraseña de la aplicación para Gmail

def send_reply(to_addr:str, subject:str):
    msg = MIMEText("Thank you! We have received your letter and will reply as soon as possible.")
    msg["Subject"] = f"Re: {subject or ''}".strip()
    msg["From"] = EMAIL
    msg["To"] = to_addr
    with smtplib.SMTP_SSL(SMTP, 465) as smtp:
        smtp.login(EMAIL, PASS)
        smtp.sendmail(EMAIL, [to_addr], msg.as_string())

with imaplib.IMAP4_SSL(IMAP) as imap:
    imap.login(EMAIL, PASS)
    imap.select("INBOX")
    status, data = imap.search(None, '(UNSEEN)')
    ids = data[0].split()
    for msg_id in ids:
        _, raw = imap.fetch(msg_id, "(RFC822)")
        msg = email.message_from_bytes(raw[0][1])
        sender = email.utils.parseaddr(msg.get("From",""))[1]
        subj   = msg.get("Subject","")
        if sender:
            send_reply(sender, subj)
        # marcar como leído
        imap.store(msg_id, '+FLAGS', '\\Seen')

💡 Consejo: durante las pruebas, añade el «modo seco» (dry-run) para registrar las acciones en lugar de enviarlas realmente.

🔥 100.000+ estudiantes ya están con nosotros

¿Cansado de leer teoría?
¡Hora de programar!

Kodik — una app donde aprendes a programar con práctica. Mentor IA, lecciones interactivas, proyectos reales.

🤖 IA 24/7
🎓 Certificados
💰 Gratis
🚀 Empezar
Se unieron hoy

Más inteligente: respuestas por palabras clave 🧭

La lógica más simple: miramos el tema y el cuerpo de la carta, elegimos una plantilla de respuesta.

KEYMAP = {
    "payment": "Regarding payment: the invoice has been sent, the terms are 1-2 banking days. If you need an act, please reply to this letter.",
    "cooperation": "Thank you for your interest! Please write briefly about your audience and format, and we will get back to you with a proposal.",
    "Technical support": "Describe the playback steps and send screenshots/logs — we will help you promptly."
}
DEFAULT = "Thank you for your letter! We are in touch and will get back to you as soon as possible."

def choose_reply(subject:str, body:str) -> str:
    text = f"{subject} {body}".lower()
    for key, template in KEYMAP.items():
        if key in text:
            return template
    return DEFAULT

Se puede ampliar a una simple «intención»: buscar varias claves, contar el «peso» de las coincidencias y elegir la mejor plantilla.

Despliegue y operación 🚀

  • Planificador: cron, APScheduler o systemd-timer.

  • Docker: fija la versión de Python y las dependencias, conecta .env como secreto.

  • Registros: nivel de INFORMACIÓN para un funcionamiento normal y ADVERTENCIA/ERROR para fallos; enviar errores a Telegram/Slack.

  • Limitación de frecuencia: no responda más de una vez a la dirección en un día; mantenga un caché de «respuestas de las últimas 24 horas».

  • A/B: prueba los textos de respuesta automática y el asunto del correo electrónico, ya que afecta a la comunicación posterior.

Seguridad y ética 🔒

  • Guarda los secretos en .env, usa App Password o OAuth 2.0, no confirmar los tokens en el repositorio.

  • Añade a la respuesta «has recibido una respuesta automática» y una forma de contactar a la persona.

  • Mantenga una lista blanca de dominios/direcciones para acciones automáticas; deje los correos electrónicos controvertidos para el análisis manual.

  • Cumple con la política del proveedor de correo electrónico y la ley de datos personales.

📊 Qué puede hacer un bot de correo en Python

Guion

Qué hace el bot

Beneficios

Respuesta automática

«Gracias, hemos recibido la carta» + plazo de espera

Elimina la rutina, acelera la primera respuesta

Filtración

Lo pone en carpetas: «pago», «cooperación», «soporte»

Bandeja de entrada sin caos

Reenvío

Envía preguntas sobre pagos al contador, integraciones al soporte técnico

Enrutamiento rápido

Palabras clave

Selecciona una plantilla según el contenido del correo electrónico

Respuestas más relevantes

Integración con CRM

Crea un cliente potencial/oportunidad, trae un contacto

Embudo transparente

Respuesta de IA

Genera texto a través de LLM a partir de un breve resumen de la carta

Tono humano, menos trabajo manual

Ideas de actualización 💡

  • Resumen de la carta: extrae un resumen breve y sustitúyelo en la respuesta.

  • Plantillas con variables: nombre del remitente, número de pedido, fecha límite.

  • Antibucle: no responder a respuestas automáticas/no-reply, comprobar encabezados Auto-Submitted.

  • Multilingüismo: determina el idioma de la carta y selecciona una plantilla.

📎 Guarda las plantillas en JSON/YAML y realiza cambios sin publicar código.

En Codice hacemos que el aprendizaje de la programación sea emocionante y comprensible: tenemos cursos interesantes con tareas que ayudan a mejorar las habilidades paso a paso.

Y también tenemos un canal de telegram, donde discutimos ideas geniales, compartimos experiencias y analizamos juntos las tareas: aprender no solo es útil, sino también divertido.

Deja un comentario: ¿qué escenario de respuesta automática necesitas exactamente: «pago», «soporte», «cooperación» o algo propio?

🎯Deja de postergar

¿Te gustó el artículo?
¡Hora de practicar!

En Kodik no solo lees — escribes código de inmediato. Teoría + práctica = habilidades reales.

Práctica instantánea
🧠IA explica código
🏆Certificado

Sin registro • Sin tarjeta