Servidor REST para envío de correos electrónicos con archivos PDF adjuntos desde un Storage Server, utilizando Gmail API.
Email-Server-Python/
├── src/
│ ├── config/ # Configuración general y logging
│ │ ├── settings.py
│ │ └── logging_config.py
│ ├── connection/ # Conexiones externas (Gmail API)
│ │ └── gmail_connection.py
│ ├── controller/ # Controladores REST (endpoints)
│ │ └── email_controller.py
│ ├── data/ # Acceso a datos (reservado para futuro uso)
│ ├── domain/ # Lógica de negocio (reservado para futuro uso)
│ ├── dto/ # Data Transfer Objects
│ │ └── email_dto.py
│ ├── interfaces/ # Interfaces y contratos
│ │ └── email_interfaces.py
│ └── services/ # Servicios de aplicación
│ ├── gmail_service.py
│ ├── storage_service.py
│ └── send_email_service.py
├── logs/ # Archivos de log
├── main.py # Punto de entrada de la aplicación
├── credentials.json # Credenciales de Google Cloud (no subir a Git)
├── token.json # Token OAuth de Gmail (no subir a Git)
└── requirements.txt # Dependencias del proyecto
- Python 3.12+
- Cuenta de Google con Gmail API habilitada
- Storage Server corriendo en puerto 5000
git clone https://github.com/Proyecto-Info-Aplicada/Email-Server-Python.git
cd Email-Server-Pythonpython -m venv .venvWindows (PowerShell):
.\.venv\Scripts\Activate.ps1Windows (CMD):
.venv\Scripts\activate.batLinux/Mac:
source .venv/bin/activatepip install -r requirements.txt- Crear proyecto en Google Cloud Console
- Habilitar Gmail API
- Crear credenciales OAuth 2.0
- Descargar credenciales y guardar como
credentials.jsonen la raíz del proyecto
python main.pyO usar los scripts incluidos:
Windows:
start-app.batPara facilitar las pruebas, incluimos una colección de Postman lista para importar:
Archivo: Email-Server-Postman-Collection.json
- Abrir Postman
- Click en "Import" (esquina superior izquierda)
- Seleccionar el archivo
Email-Server-Postman-Collection.json - La colección incluye:
- ✅ Todos los endpoints documentados
- ✅ Ejemplos de requests completos
- ✅ Variables de entorno pre-configuradas
- ✅ Respuestas de ejemplo
Verificar estado del servidor
{
"message": "Email Server corriendo correctamente ✅"
}Enviar email con PDF adjunto
Request Body:
{
"CorrelationId": "uuid-del-pdf",
"EmailAddress": "destinatario@example.com",
"Subject": "Asunto del correo",
"MessageBody": "Cuerpo del mensaje",
"PdfFileName": "documento.pdf"
}Response (Success):
{
"status": "success",
"message": "Correo enviado correctamente a destinatario@example.com"
}Response (Error):
{
"error": "Descripción del error"
}Health check del servicio
{
"status": "healthy",
"service": "email-server"
}# Storage Server
STORAGE_URL = "http://127.0.0.1:5000/pdf-storage"
TIMEOUT_SECONDS = 10
# Gmail API
GMAIL_SCOPES = ['https://www.googleapis.com/auth/gmail.send']
CREDENTIALS_FILE = 'credentials.json'
TOKEN_FILE = 'token.json'
# Servidor
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 5001
DEBUG_MODE = True- Flask - Framework web
- Google Gmail API - Envío de correos
- Requests - Comunicación HTTP con Storage Server
- Python Logging - Sistema de logs
Los logs se almacenan en logs/email-server.log con el formato:
2025-10-22 12:00:00,000 | INFO | Mensaje del log
Archivos sensibles (NO subir a Git):
credentials.jsontoken.json.venv/logs/__pycache__/
Estos archivos están incluidos en .gitignore.
# Instalar pytest
pip install pytest
# Ejecutar tests (cuando estén implementados)
pytest- Fork el proyecto
- Crear una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -m 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abrir un Pull Request
Este proyecto es parte del curso de Información Aplicada - UCR 2025.
Desarrollado con ❤️ por el equipo de Proyecto-Info-Aplicada