Plateforme d'e-Discovery construite avec Django + PostgreSQL pour analyser le corpus Enron (plus de 500 000 emails).
L'objectif est de transformer un corpus d'emails non structure en application web d'investigation permettant de:
- naviguer dans les echanges,
- rechercher des informations critiques,
- identifier des acteurs cles,
- reconstruire des conversations (threads).
Source des donnees: Enron Email Dataset (CMU)
https://www.cs.cmu.edu/~enron/
- Backend et interface: Django 5.2
- Base de donnees: PostgreSQL 16 (Docker)
- Recherche plein texte: PostgreSQL FTS (SearchVector + index GIN)
- Parsing/ingestion: Python (
email,re,datetime) - Environnement Python:
venv - Versionnage: Git
enron_discovery/
├── docker-compose.yml
├── manage.py
├── requirements.txt
├── README.md
├── .gitignore
├── enron_mail_20150507.tar.gz
├── data/
├── maildir/ # non versionne (corpus)
├── scripts/
│ ├── import_enron.py # scripts exploratoires
│ └── parse_email.ipynb # usage Pandas exploratoire
├── polls/
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── urls.py
│ ├── views.py
│ ├── tests.py
│ ├── migrations/
│ │ ├── 0001_initial.py
│ │ ├── 0002_...
│ │ ├── 0003_...
│ │ └── 0004_...
│ ├── management/
│ │ └── commands/
│ │ └── import_enron.py # commande principale d'import
│ └── templates/
│ ├── dashboard.html
│ ├── search.html
│ ├── thread_detail.html
│ └── influence.html # optionnel
└── enron_discovery/
├── settings.py
├── urls.py
├── asgi.py
└── wsgi.py
email(unique)name
name
message_id(unique)datesubjectbodyfrom_employee(FK -> Employee)to_employees(M2M -> Employee)cc_employees(M2M -> Employee)bcc_employees(M2M -> Employee)in_reply_to(FK recursive -> Email)folder(FK -> Folder)search_vector(FTS)
email(FK -> Email)filenamecontent_typesize
- unicite:
Employee.email,Email.message_id - cles etrangeres: expediteur, dossier, pieces jointes, thread parent
- tables M2M dediees pour To/Cc/Bcc
- index B-tree sur
date - index B-tree sur
message_id - index GIN sur
search_vector(FTS)
Commande principale: polls/management/commands/import_enron.py
Fonctionnalites:
- parcours recursif des
.eml - extraction
From,To,Cc,Bcc,Date,Subject,Message-ID,In-Reply-To - nettoyage du corps (encodage + suppression basique signatures/disclaimers)
- creation des dossiers, collaborateurs, emails, pieces jointes
- reconstruction des threads (
in_reply_to) - mise a jour FTS (
search_vector) - import idempotent/incremental (pas de reimport inutile)
- Python 3.12+
- Docker + Docker Compose
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txtdocker compose up -d
docker compose pspython manage.py makemigrations
python manage.py migratepython manage.py import_enron --path /chemin/vers/maildirpython manage.py runserverConfiguration PostgreSQL (docker-compose.yml + settings.py) :
- DB:
enron_db - User:
enron - Password:
enron2026 - Host:
127.0.0.1 - Port hote:
5433
- Dashboard:
http://127.0.0.1:8000/dashboard/ - Recherche avancee:
http://127.0.0.1:8000/search/ - Thread detail:
http://127.0.0.1:8000/thread/<email_id>/ - Graphe d'influence (optionnel):
http://127.0.0.1:8000/influence/ - Admin Django:
http://127.0.0.1:8000/admin/
- volume des emails par mois
- top 10 expediteurs les plus actifs
- recherche par mots-cles (FTS PostgreSQL)
- filtre expediteur
- filtre plage de dates
- pagination des resultats
- affichage d'un email
- reconstitution chronologique de la conversation (racine + reponses)
- connexions expediteur -> destinataire les plus frequentes
- filtre optionnel par utilisateur
Compter les emails importes:
python3 manage.py shell -c "from polls.models import Email,Employee,Attachment; print('Emails:', Email.objects.count(), 'Employees:', Employee.objects.count(), 'Attachments:', Attachment.objects.count())"Compter les fichiers source:
find ./maildir -type f | wc -lLe corpus Enron est connu pour contenir des problemes d'integrite (messages rediges, adresses corrigees, en-tetes heterogenes). Pour eviter les dates aberrantes dans les graphiques (ex: annee 2044 issue d'un parsing ambigu), l'import applique une validation simple:
- date invalide ou non parsable =>
NULL - annee hors plage plausible du corpus (
1990-2010) =>NULL
Cette regle est appliquee a l'import et au dashboard mensuel pour conserver des statistiques coherentes.
Le projet contient des tests Django dans polls/tests.py pour valider les principales fonctionnalités de l'interface:
- page d'accueil (
home) - dashboard (
dashboard) - recherche avancée (
search_emails) - explorateur de threads (
thread_detail) - graphe d'influence (
influence_graph) - liste paginée des emails (
email_list)
Depuis la racine du projet:
source .venv/bin/activate
docker compose up -d
python manage.py test polls -v 2Exécuter un test spécifique
python manage.py test polls.tests.EnronViewsTestCase.test_search_by_keyword_fts -v 2Projet realise dans le cadre du cours de Structuration des Donnees (2026).
Redige par WADE Abdou et TCHAGANO Bahissou.