EmailCenter envoie des emails HTML transactionnels via Gmail, avec un composeur web, des templates Jinja2, une synchronisation Gmail et des outils de recherche sur les fichiers et les contacts.
- Python 3.10+
credentials.jsonpour OAuth Gmail Desktop- un premier passage OAuth pour generer
token.json
PowerShell:
python -m venv .venv
.venv\Scripts\pip.exe install google-auth google-auth-oauthlib google-api-python-client jinja2 python-dotenv flask requestsBatch:
python -m venv .venv
.venv\Scripts\pip.exe install google-auth google-auth-oauthlib google-api-python-client jinja2 python-dotenv flask requestsLe projet lit .env via config.py.
Variables utiles:
GMAIL_CREDENTIALS_FILE=credentials.json
GMAIL_TOKEN_FILE=token.json
GMAIL_SENDER=yvon.huynh@gmail.com
GMAIL_SENDER_NAME=Yvon Huynh
TEMPLATES_DIR=templates
ATTACHMENTS_DIR=attachments
PAYLOADS_DIR=payloads
WEBHOOK_SECRET=...
RATE_LIMIT_DAY=500
RATE_LIMIT_SEC=0.5
GMAIL_SYNC_INTERVAL_HOURS=6
EMAILCENTER_ALLOWED_HOSTS=localhost,127.0.0.1,::1,emailcenter.local
OAUTHLIB_INSECURE_TRANSPORT=1OAUTHLIB_INSECURE_TRANSPORT=1 sert uniquement en local pour OAuth Gmail sans HTTPS.
PowerShell:
.venv\Scripts\python.exe app.pyBatch:
start_emailcenter.batLe batch lance Flask en arrière-plan et écrit dans logs\app.log.
- Créer un projet Google Cloud.
- Activer Gmail API.
- Créer un client OAuth 2.0 de type Desktop App.
- Placer
credentials.jsonà la racine du projet. - Ouvrir
http://localhost:5000/auth. - Valider l'autorisation Google.
Le jeton est sauvegardé dans token.json et réutilisé automatiquement.
Si tu avais encore un ancien token.pickle, supprime-le puis relance /auth pour repartir proprement.
Si le refresh échoue ou que le token est révoqué, les routes Gmail renvoient 401 et il faut refaire /auth.
Compose web:
- Ouvrir l'interface sur
http://localhost:5000/. - Choisir un template.
- Modifier le JSON payload et les champs destinataire / sujet.
- Lancer la preview.
- Optionnellement ouvrir le composer HTML.
- Envoyer ou sauvegarder en brouillon.
CLI:
- Copier un exemple depuis
payload_templates/verspayloads/ou créer un fichier JSON. - Adapter
template_id,toetdata. - Lancer:
.venv\Scripts\python.exe main.py payload.jsonExemple minimal:
{
"template_id": "welcome",
"to": "user@example.com",
"data": {
"first_name": "Alice",
"recipient_email": "user@example.com"
}
}Payloads:
GET /api/payloadsliste les payloads d'exemple.GET /api/payloads/<template_id>charge un payload d'exemple pour un template.POST /api/webhook/payloadenregistre un payload JSON danspayloads/si le secret est fourni.
Gmail:
POST /api/gmail/syncsynchronise les messages Gmail.GET /api/gmail/messagesaffiche les messages de la vue Mail.GET /api/gmail/message/<id>charge le contenu d'un message.POST /api/gmail/message/<id>/readmarque un message comme lu.POST /api/gmail/message/<id>/classifyclasse un message.POST /api/gmail/message/<id>/downloadtélécharge les pieces jointes détectées.
Contacts et routage:
GET /api/contactsetPOST /api/contactsPUT /api/contacts/<id>etDELETE /api/contacts/<id>POST /api/contacts/<id>/emailsGET /api/routing-rulesPOST /api/routing-rulesPUT /api/routing-rules/<id>DELETE /api/routing-rules/<id>
Recherche et aperçu:
GET /api/recipients/suggestPOST /api/compose/folder-suggestPOST /api/previewGET /api/everything/searchGET /api/file?path=...
Chaque template templates/*.html doit définir le sujet au debut:
{% set subject = "Sujet" %}Les payloads d'exemple sont dans payload_templates/. invoice.html a ete retire car il etait vide.
Il n'y a pas de suite de tests automatisee. Les verifications minimales utiles sont:
PowerShell:
.venv\Scripts\python.exe -m py_compile app.py config.py template_engine.py main.py- Le serveur Flask ne doit pas etre expose publiquement sans durcissement supplementaire.
- Les routes POST sensibles exigent un
Hostet unOriginlocaux compatibles, plus un token CSRF. - Le secret de webhook doit rester hors du depot.
- Les pieces jointes issues du navigateur ne gardent pas toujours leur chemin source d'origine.
- La recherche Everything interroge
http://localhost:81/; le service Everything doit tourner localement. - La synchronisation Gmail et l'index SQL sont des etats locaux; un reset peut etre necessaire apres corruption ou migration.