Proyecto1AVApsp/ARQUITECTURA_CORREO.md

247 lines
7.9 KiB
Markdown

# 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