Esta es una API para el envío de correos electrónicos utilizando FastAPI y SMTP. La API está protegida mediante un token de autorización y limita la cantidad de solicitudes por minuto por dirección IP. Además, el contenido HTML de los correos se sanitiza para evitar inyecciones maliciosas.
- Envío de correos electrónicos: La API permite enviar correos electrónicos mediante una conexión segura SMTP.
- Protección mediante token: Acceso protegido con Bearer Token para seguridad en el envío de correos.
- Sanitización de HTML: Sanitización del contenido HTML con
bleach
para evitar vulnerabilidades XSS. - Rate Limiting: Límite de 2 solicitudes por minuto por IP, configurable.
- Logging: Registro de los eventos importantes y errores en un archivo de log.
- Validación de entradas: Validación de los correos electrónicos y estructura del mensaje con Pydantic.
Sigue los pasos a continuación para instalar y ejecutar la API localmente.
- Python 3.8+: Asegúrate de tener Python instalado.
- Virtualenv: Es recomendable crear un entorno virtual.
git clone https://github.com/tu_usuario/Email-API-FastAPI.git
cd Email-API-FastAPI
python -m venv venv
source venv/bin/activate # En Windows usa: venv\Scripts\activate
Instala las dependencias definidas en el archivo requirements.txt
.
pip install -r requirements.txt
Debes configurar las siguientes variables de entorno en un archivo .env
en la raíz del proyecto.
Ejemplo de .env
:
SMTP_HOST=smtp.tu_dominio.com
SMTP_PORT=587
SMTP_USERNAME=tu_usuario
SMTP_PASSWORD=tu_contraseña
AUTHORIZATION_TOKEN=tu_token_de_autorizacion
- SMTP_HOST: El servidor SMTP que se utilizará para enviar correos.
- SMTP_PORT: El puerto del servidor SMTP (587 para TLS).
- SMTP_USERNAME: El nombre de usuario para autenticarse en el servidor SMTP.
- SMTP_PASSWORD: La contraseña del usuario SMTP.
- AUTHORIZATION_TOKEN: Token de autorización Bearer para proteger la API.
Para ejecutar la API localmente, usa el siguiente comando:
uvicorn main:app --reload
Esto iniciará la aplicación en http://localhost:8000
.
Este endpoint permite enviar un correo electrónico. Requiere autenticación mediante un Bearer Token.
-
URL:
/send/
-
Método:
POST
-
Headers:
Authorization: Bearer <token>
-
Body (JSON):
{ "from_email": "turemitente@ejemplo.com", "to_email": ["destinatario1@ejemplo.com", "destinatario2@ejemplo.com"], "subject": "Asunto del correo", "html": "<p>Contenido HTML del correo</p>" }
curl -X POST "http://localhost:8000/send/" \
-H "Authorization: Bearer <tu_token>" \
-H "Content-Type: application/json" \
-d '{
"from_email": "remitente@ejemplo.com",
"to_email": ["destinatario@ejemplo.com"],
"subject": "Prueba de correo",
"html": "<p>Este es un correo de prueba</p>"
}'
El API puede devolver las siguientes respuestas HTTP:
-
200 OK: El correo fue enviado con éxito.
{ "detail": { "message": "Email sent successfully", "status": 200 } }
-
401 Unauthorized: Token de autorización inválido o no proporcionado.
{ "detail": { "message": "Invalid or missing token", "status": 401 } }
-
429 Too Many Requests: Se excedió el límite de solicitudes permitidas por IP.
{ "detail": { "message": "Too many requests, please try again later.", "status": 429 } }
-
500 Internal Server Error: Error al intentar enviar el correo.
{ "detail": { "message": "Error sending email: <detalle_del_error>", "status": 500 } }
El archivo de log (app.log
) almacenará información relevante de los correos enviados y errores en caso de que los haya.
El rate limit está configurado para permitir un máximo de 2 solicitudes por minuto por IP. Este límite puede ser ajustado modificando el decorador @limiter.limit
en el archivo main.py
.
Puedes usar curl
, Postman o cualquier herramienta similar para hacer pruebas de la API.
- El contenido HTML de los correos es sanitizado para evitar inyecciones maliciosas.
- Las credenciales del servidor SMTP y el token de autorización no deben compartirse ni exponerse públicamente.
- Asegúrate de utilizar conexiones TLS para el envío seguro de correos electrónicos.
Las contribuciones son bienvenidas. Si deseas agregar nuevas características o corregir errores, por favor, abre un pull request o inicia una discusión.
- Haz un fork del repositorio.
- Crea una nueva rama (
git checkout -b feature/nueva-caracteristica
). - Realiza tus cambios y haz commit (
git commit -m "Descripción de los cambios"
). - Haz push a la rama (
git push origin feature/nueva-caracteristica
). - Abre un pull request.
Este proyecto está licenciado bajo los términos de la MIT License.