7.9 KiB
7.9 KiB
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:
-
Servers → Dovecot IMAP/POP3 Server
- Habilitar servicio IMAP en puerto 143
- Configurar usuarios y contraseñas
-
Servers → Postfix Mail Server
- Habilitar servicio SMTP en puerto 25
- Configurar dominio y relay
-
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:
- Usar IMAPS (puerto 993) en lugar de IMAP (143)
- Usar SMTPS (puerto 465/587) en lugar de SMTP (25)
- Implementar SSL/TLS en las conexiones
- No usar contraseñas en texto plano en el código
- Usar autenticación del servidor SMTP
Mejora de seguridad (código):
# 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
# 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:
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
-
Seguridad
- Implementar SSL/TLS
- Autenticación segura
- Gestión de certificados
-
Funcionalidad
- Soporte para adjuntos
- Vista HTML mejorada
- Múltiples carpetas
- Búsqueda de correos
- Responder/Reenviar
-
UI/UX
- Indicador de correos no leídos
- Filtros y ordenamiento
- Marcadores/etiquetas
- Vista previa de adjuntos
-
Performance
- Carga asíncrona de correos
- Cache de correos
- Paginación