Skip to content

Commit f273947

Browse files
Ajout de la vérification de l'état du serveur SMTP et mise à jour de la gestion des erreurs lors de l'envoi d'emails. Ajout des liens vers le projet et le profil GitHub dans le README.
1 parent 3639980 commit f273947

3 files changed

Lines changed: 152 additions & 4 deletions

File tree

README.md

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,21 @@ Envoi d'un email
142142
}
143143
```
144144

145+
#### GET `/api/smtp-status`
146+
Vérification du statut du serveur SMTP
147+
148+
**Réponse :**
149+
```json
150+
{
151+
"status": true,
152+
"message": "SMTP server is reachable."
153+
}
154+
```
155+
156+
**États possibles :**
157+
- `status: true` : Le serveur SMTP est accessible et les identifiants sont valides
158+
- `status: false` : Le serveur SMTP n'est pas accessible ou les identifiants sont incorrects
159+
145160
## 💡 Exemples d'utilisation
146161

147162
### Envoi d'un email simple
@@ -244,6 +259,57 @@ sendEmail(
244259
);
245260
```
246261

262+
### Vérification du statut SMTP
263+
264+
```bash
265+
# Vérifier si le serveur SMTP est accessible
266+
curl http://localhost:9876/api/smtp-status
267+
```
268+
269+
**Réponse en cas de succès :**
270+
```json
271+
{
272+
"status": true,
273+
"message": "SMTP server is reachable."
274+
}
275+
```
276+
277+
**Réponse en cas d'erreur :**
278+
```json
279+
{
280+
"status": false,
281+
"message": "SMTP server is not reachable."
282+
}
283+
```
284+
285+
### Intégration du test SMTP en Python
286+
287+
```python
288+
import requests
289+
290+
def check_smtp_status():
291+
try:
292+
response = requests.get("http://localhost:9876/api/smtp-status")
293+
data = response.json()
294+
295+
if data["status"]:
296+
print("✅ Serveur SMTP accessible")
297+
return True
298+
else:
299+
print("❌ Serveur SMTP non accessible:", data["message"])
300+
return False
301+
except Exception as e:
302+
print(f"Erreur lors de la vérification : {e}")
303+
return False
304+
305+
# Utilisation
306+
if check_smtp_status():
307+
# Procéder à l'envoi d'emails
308+
send_email("test@example.com", "Test", "Message de test")
309+
else:
310+
print("Impossible d'envoyer des emails pour le moment")
311+
```
312+
247313
## 🔧 Gestion des erreurs
248314

249315
### Codes de statut HTTP
@@ -272,10 +338,52 @@ sendEmail(
272338
}
273339
```
274340

341+
## 📊 Diagnostic et monitoring
342+
343+
### Vérification de l'état du service
344+
345+
```bash
346+
# Vérifier que le service répond
347+
curl http://localhost:9876/
348+
349+
# Vérifier la documentation API
350+
curl http://localhost:9876/docs
351+
352+
# Tester la connectivité SMTP
353+
curl http://localhost:9876/api/smtp-status
354+
```
355+
356+
```bash
357+
# Test d'envoi d'email (optionnel)
358+
echo "3. Test d'envoi d'email de diagnostic..."
359+
curl -X POST "http://localhost:9876/api/send-email" \
360+
-H "Content-Type: application/json" \
361+
-d '{
362+
"receiver_email": "admin@votre-domaine.com",
363+
"email_object": "Test de diagnostic - Mail Service",
364+
"message_text": "Ce message confirme que le service fonctionne correctement."
365+
}'
366+
367+
echo "=== Fin du diagnostic ==="
368+
```
369+
370+
## 🚨 Sécurité et bonnes pratiques
371+
372+
### Recommandations de sécurité
373+
374+
1. **Utilisez des mots de passe d'application** pour Gmail (pas votre mot de passe principal)
375+
2. **Limitez l'accès** au port 9876 dans votre pare-feu
376+
3. **Utilisez HTTPS** en production avec un reverse proxy (nginx, traefik)
377+
4. **Stockez les secrets** de manière sécurisée (Docker secrets, variables d'environnement chiffrées)
378+
5. **Surveillez régulièrement** le statut SMTP avec l'endpoint `/api/smtp-status`
379+
275380

276381
---
277382

278383

279384
**Développé avec ❤️ par Kalaga Serge**
280385

281-
Pour plus d'informations, consultez la documentation API interactive à l'adresse `http://localhost:9876/docs`
386+
<!-- Mes coordonnées Github -->
387+
388+
- [Projet GitHub](https://github.com/serge-eric-kalaga/MailService)
389+
- [Profil GitHub - serge-eric-kalaga](https://github.com/serge-eric-kalaga)

api.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from fastapi import APIRouter, Body, HTTPException
22
from fastapi.responses import JSONResponse
33
from pydantic import BaseModel
4-
from utils import send_email
4+
from utils import send_email, get_smtp_server_status
5+
6+
7+
router = APIRouter()
58

69

710
class EmailRequest(BaseModel):
@@ -13,7 +16,9 @@ class EmailRequest(BaseModel):
1316
message_text: str = Body(..., description="Content of the email")
1417

1518

16-
router = APIRouter()
19+
class ServerStatusResponse(BaseModel):
20+
status: bool
21+
message: str
1722

1823

1924
@router.post("/send-email")
@@ -52,3 +57,20 @@ async def send_email_endpoint(email_request: EmailRequest):
5257
if not success:
5358
raise HTTPException(status_code=500, detail="Error sending email")
5459
return JSONResponse(content={"message": "Email sent successfully"})
60+
61+
62+
@router.get("/smtp-status", response_model=ServerStatusResponse)
63+
async def smtp_status():
64+
"""
65+
Endpoint to check the status of the SMTP server.
66+
Returns a message indicating whether the SMTP server is reachable or not.
67+
"""
68+
try:
69+
status = get_smtp_server_status()
70+
message = (
71+
"SMTP server is reachable." if status else "SMTP server is not reachable."
72+
)
73+
return ServerStatusResponse(status=status, message=message)
74+
except Exception as e:
75+
message = f"Error checking SMTP server status: {e}"
76+
return ServerStatusResponse(status=False, message=message)

utils.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,22 @@ def send_email(receiver_email: str | list[str], message_text: str, email_object:
8787
return True
8888
except Exception as e:
8989
print(f"Error, unable to send email {e}")
90-
raise HTTPException(status_code=500, detail=f"Error sending email: {e}")
90+
raise HTTPException(status_code=400, detail=f"Error sending email: {e}")
91+
92+
93+
def get_smtp_server_status() -> bool:
94+
settings = SETTINGS
95+
EMAIL_HOST = settings.EMAIL_HOST
96+
EMAIL_PORT = settings.EMAIL_PORT
97+
EMAIL_USERNAME = settings.EMAIL_USERNAME
98+
EMAIL_PASSWORD = settings.EMAIL_PASSWORD
99+
100+
try:
101+
with smtplib.SMTP(EMAIL_HOST, EMAIL_PORT, timeout=10) as server:
102+
server.starttls()
103+
server.login(user=EMAIL_USERNAME, password=EMAIL_PASSWORD)
104+
server.noop()
105+
return True
106+
except Exception as e:
107+
print(f"SMTP server connection failed: {e}")
108+
raise e

0 commit comments

Comments
 (0)