import poplib import email import pymongo from email.utils import parsedate_to_datetime # Configuración del servidor POP3 (Sin SSL) POP3_SERVER = "192.168.120.103" POP3_PORT = 110 # Puerto POP3 estándar sin SSL EMAIL_USER = "kevin@psp.ieslamar.org" EMAIL_PASS = "1234" # Configuración de la base de datos MongoDB MONGO_CLIENT = "mongodb://localhost:27017/" DB_NAME = "correo_db" COLLECTION_NAME = "correos" # Conectar a MongoDB client = pymongo.MongoClient(MONGO_CLIENT) db = client[DB_NAME] collection = db[COLLECTION_NAME] def correo_existe(remitente, asunto, fecha): """ Verifica si un correo ya existe en la base de datos. """ return collection.find_one({"remitente": remitente, "asunto": asunto, "fecha": fecha}) is not None def guardar_correo(remitente, asunto, fecha, cuerpo): """ Guarda un correo en la base de datos si no existe. """ if correo_existe(remitente, asunto, fecha): print("⚠️ Correo ya guardado, se omite.") return correo = { "remitente": remitente, "asunto": asunto, "fecha": fecha, "cuerpo": cuerpo } collection.insert_one(correo) print("✅ Correo guardado en la base de datos.") def descargar_correos(): """ Descarga correos desde el servidor y solo guarda los nuevos. """ try: print("📡 Conectando al servidor POP3 para descargar correos...\n") mail = poplib.POP3(POP3_SERVER, POP3_PORT) mail.user(EMAIL_USER) mail.pass_(EMAIL_PASS) num_mensajes = len(mail.list()[1]) print(f"📩 Se encontraron {num_mensajes} correos en la bandeja de entrada.\n") for i in range(1, num_mensajes + 1): response, lines, octets = mail.retr(i) raw_email = b"\n".join(lines) msg = email.message_from_bytes(raw_email) remitente = msg["From"] asunto = msg["Subject"] fecha = msg["Date"] if fecha: try: fecha = parsedate_to_datetime(fecha).strftime("%Y-%m-%d %H:%M:%S") except Exception: pass cuerpo = "" if msg.is_multipart(): for part in msg.walk(): if part.get_content_type() == "text/plain": cuerpo = part.get_payload(decode=True).decode(errors="ignore") break else: cuerpo = msg.get_payload(decode=True).decode(errors="ignore") guardar_correo(remitente, asunto, fecha, cuerpo.strip()) mail.quit() print("✅ Descarga de correos completada.\n") except Exception as e: print(f"❌ Error al descargar correos: {e}") def mostrar_correos(): """ Muestra todos los correos almacenados en MongoDB. """ print("📂 Mostrando correos almacenados en la base de datos...\n") correos = collection.find() for correo in correos: print(f"📅 Fecha: {correo['fecha']}") print(f"🔹 Remitente: {correo['remitente']}") print(f"📌 Asunto: {correo['asunto']}") print(f"📝 Mensaje:\n{correo['cuerpo']}") print("-" * 40) def menu(): """ Menú interactivo para ejecutar las opciones del programa. """ while True: print("\n📬 MENÚ:") print("1. Descargar correos nuevos") print("2. Mostrar correos almacenados") print("3. Salir") opcion = input("Seleccione una opción: ") if opcion == "1": descargar_correos() elif opcion == "2": mostrar_correos() elif opcion == "3": print("👋 Saliendo...") break else: print("❌ Opción no válida, intente de nuevo.") # Ejecutar el menú interactivo menu()