# Arquitectura del Cliente de Correo - Proyecto1AVApsp ## Estructura de la aplicación ``` ┌──────────────────────────────────────────────────────────────┐ │ Proyecto1AVApsp │ │ Panel de Laboratorio │ └──────────────────────────────────────────────────────────────┘ │ ┌─────────────────────┼─────────────────────┐ │ │ │ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │ Tareas │ │ Correos │ │ Juegos │ └─────────┘ └────┬────┘ └─────────┘ │ ┌─────────────────┴─────────────────┐ │ │ ┌────▼────────┐ ┌───────▼───────┐ │ IMAP │ │ SMTP │ │ Cliente │ │ Cliente │ └─────┬───────┘ └───────┬───────┘ │ │ │ ┌──────────────┐ │ └─────────► Servidor ◄─────────┘ │ Webmin │ │ 10.10.0.101 │ └──────────────┘ ``` ## Componentes principales ### 1. Interfaz de Usuario (app.py:631-753) - Panel de configuración del servidor - Lista de correos (bandeja de entrada) - Visor de correos - Ventana de composición de correos ### 2. Gestión IMAP (app.py:1380-1540) **Funciones:** - `_connect_mail_server()`: Conecta al servidor IMAP - `_disconnect_mail_server()`: Desconecta del servidor - `_refresh_mail_list()`: Carga la lista de correos - `_on_mail_select()`: Maneja la selección de correos - `_display_mail()`: Muestra el contenido de un correo **Protocolo:** IMAP (Puerto 143) ### 3. Gestión SMTP (app.py:1585-1620) **Funciones:** - `_open_compose_window()`: Abre ventana de redacción - `_send_mail()`: Envía correos usando SMTP **Protocolo:** SMTP (Puerto 25) ## Flujo de datos ### Lectura de correos (IMAP) ``` Usuario → Clic "Conectar" ↓ _connect_mail_server() ↓ imaplib.IMAP4(host, 143) ↓ imap.login(usuario, contraseña) ↓ imap.select('INBOX') ↓ _refresh_mail_list() ↓ imap.search(None, 'ALL') ↓ imap.fetch(mail_id, 'RFC822') ↓ email.message_from_bytes() ↓ Mostrar en Listbox ↓ Usuario selecciona correo ↓ _display_mail() ↓ Parsear contenido (texto/HTML) ↓ Mostrar en ScrolledText ``` ### Envío de correos (SMTP) ``` Usuario → Clic "Nuevo correo" ↓ _open_compose_window() ↓ Usuario completa campos (Para, Asunto, Mensaje) ↓ Usuario → Clic "Enviar" ↓ _send_mail() ↓ MIMEMultipart() ↓ MIMEText(body, 'plain') ↓ smtplib.SMTP(host, 25) ↓ server.send_message(msg) ↓ Confirmación al usuario ``` ## Protocolos de comunicación ### IMAP (Internet Message Access Protocol) - **Puerto**: 143 (sin cifrar) / 993 (cifrado) - **Uso**: Leer correos del servidor - **Ventajas**: - Los correos permanecen en el servidor - Acceso desde múltiples dispositivos - Sincronización de carpetas ### SMTP (Simple Mail Transfer Protocol) - **Puerto**: 25 (sin cifrar) / 587 (TLS) / 465 (SSL) - **Uso**: Enviar correos - **Autenticación**: Opcional según configuración del servidor ## Configuración del servidor Webmin ### Servicios necesarios: ``` ┌─────────────────────────────────────────┐ │ Webmin (http://10.10.0.101:20000) │ ├─────────────────────────────────────────┤ │ Servicios de correo: │ │ • Postfix (SMTP) → Puerto 25 │ │ • Dovecot (IMAP) → Puerto 143 │ │ • Dovecot (POP3) → Puerto 110 │ └─────────────────────────────────────────┘ ``` ### Pasos en Webmin: 1. **Servers → Dovecot IMAP/POP3 Server** - Habilitar servicio IMAP en puerto 143 - Configurar usuarios y contraseñas 2. **Servers → Postfix Mail Server** - Habilitar servicio SMTP en puerto 25 - Configurar dominio y relay 3. **System → Users and Groups** - Crear usuarios del sistema para correo - Asignar contraseñas ## Seguridad ### Advertencias actuales: ⚠️ **La implementación actual usa conexiones sin cifrar** ### Recomendaciones: 1. Usar IMAPS (puerto 993) en lugar de IMAP (143) 2. Usar SMTPS (puerto 465/587) en lugar de SMTP (25) 3. Implementar SSL/TLS en las conexiones 4. No usar contraseñas en texto plano en el código 5. Usar autenticación del servidor SMTP ### Mejora de seguridad (código): ```python # IMAP con SSL import imaplib imap = imaplib.IMAP4_SSL('10.10.0.101', 993) # SMTP con TLS import smtplib smtp = smtplib.SMTP('10.10.0.101', 587) smtp.starttls() smtp.login(username, password) ``` ## Estructura de archivos ``` Proyecto1AVApsp/ ├── app.py # Aplicación principal con cliente de correo ├── CORREO_README.md # Documentación de usuario ├── test_mail_server.py # Script de prueba de conectividad ├── requirements.txt # Dependencias (smtplib/imaplib incluidos en Python) └── README.md # Documentación general del proyecto ``` ## Variables de estado ```python # Variables del cliente de correo (en DashboardApp) self.mail_connected = False # Estado de conexión self.imap_connection = None # Objeto de conexión IMAP self.current_mailbox = 'INBOX' # Bandeja actual self.mail_list = [] # Lista de correos cargados # Widgets de UI self.mail_imap_host # Entry: servidor IMAP self.mail_imap_port # Entry: puerto IMAP self.mail_smtp_host # Entry: servidor SMTP self.mail_smtp_port # Entry: puerto SMTP self.mail_username # Entry: usuario self.mail_password # Entry: contraseña self.mail_listbox # Listbox: lista de correos self.mail_body_text # ScrolledText: cuerpo del correo ``` ## Testing ### Script de prueba de conectividad: ```bash python3 test_mail_server.py ``` Este script verifica: - Conexión a Webmin (puerto 20000) - Disponibilidad de SMTP (puerto 25) - Disponibilidad de IMAP (puerto 143) - Disponibilidad de POP3 (puerto 110) ## Próximas mejoras 1. **Seguridad** - [ ] Implementar SSL/TLS - [ ] Autenticación segura - [ ] Gestión de certificados 2. **Funcionalidad** - [ ] Soporte para adjuntos - [ ] Vista HTML mejorada - [ ] Múltiples carpetas - [ ] Búsqueda de correos - [ ] Responder/Reenviar 3. **UI/UX** - [ ] Indicador de correos no leídos - [ ] Filtros y ordenamiento - [ ] Marcadores/etiquetas - [ ] Vista previa de adjuntos 4. **Performance** - [ ] Carga asíncrona de correos - [ ] Cache de correos - [ ] Paginación