Vérification emails
Vérification emails
Le module verify_emails valide la délivrabilité d'une liste d'adresses email avant l'envoi d'une campagne. Il vérifie la syntaxe, résout les enregistrements MX, ouvre une sonde contre le serveur récepteur, et signale les adresses jetables ou en forme de boîte générique de fonction.
Il s'exécute après une étape d'enrichissement ayant produit des emails, ou contre une liste importée. Le job est parallèle : il ne consomme pas de slot sur la file multi-proxy et peut tourner en même temps que des jobs d'extraction.
Les domaines jetables et alias sont détectés, y compris les fournisseurs modernes (Apple, DuckDuckGo, ProtonMail) que des outils similaires rejettent à tort. Les domaines catch-all sont remontés comme cas où la délivrabilité ne peut être garantie.
Inputs
| Champ | Requis | Source |
|---|---|---|
email |
oui | issu d'un job emails précédent, ou importé |
nom |
non | transmis en passe-plat vers la sortie |
telephone |
non | transmis en passe-plat |
site_web |
non | transmis en passe-plat |
needs: ['email']. Les items sans @ sont écartés à la création du job. La déduplication se fait sur l'adresse en minuscules. Le job accepte entre 1 et 10000 items par appel.
source_job_id est optionnel et pointe vers le job emails dont la sortie est vérifiée. L'UI expose ce sélecteur en from_jobs_of_type: 'emails'.
Outputs
Le job produit un rapport de vérification. Chaque ligne porte l'adresse vérifiée, le verdict, et un passe-plat des champs d'identification de l'entrée.
| Colonne | Type | Signification |
|---|---|---|
email |
string | Adresse en minuscules telle que soumise |
status |
string | Verdict de délivrabilité (voir valeurs ci-dessous) |
category |
string | Comment le verdict a été obtenu : smtp, syntax, disposable, suspect, big_provider, no_mx, error |
reason |
string | Explication lisible du verdict |
suggested_fix |
string | Correction suggérée en cas de typo évidente, si détectée (optionnel) |
smtp_code |
string | Code de réponse SMTP brut de la sonde, si un check SMTP a eu lieu |
catch_all |
string | yes / no / unknown — le domaine accepte-t-il n'importe quelle adresse |
nom |
string | Transmis depuis l'entrée |
telephone |
string | Transmis depuis l'entrée |
site_web |
string | Transmis depuis l'entrée |
status prend l'une des valeurs :
| Valeur | Signification |
|---|---|
valid |
Le serveur récepteur a accepté l'adresse — délivrable |
valid_catch_all |
Accepté, mais le domaine est catch-all : l'acceptation n'est pas une garantie |
invalid |
Le serveur a rejeté l'adresse — ne pas envoyer |
greylisted |
Différé temporairement par le serveur ; réessayable plus tard |
unknown |
Indéterminable (timeout, sonde bloquée…) |
filtered |
Rejeté avant l'étape SMTP — syntaxe, jetable, rôle/suspect, ou pas de MX (voir category) |
skipped |
Gros fournisseur gratuit (Gmail, Outlook…) qui rejette les sondes ; considéré délivrable |
Les colonnes de signal (status, category) sont déclarées dans le registre des modules sous produces. Ce sont les colonnes sur lesquelles les campagnes et les nœuds filter / sort aval peuvent brancher.
Cycle de vie
États de job standard — voir Cycle de vie des jobs. La progression est rapportée par email (progress_unit: 'emails').
Pipeline
Le module déclare le contrat suivant :
| Propriété | Valeur |
|---|---|
needs |
email |
produces |
status, category |
category |
verify |
pipelinable |
true |
supports_veille |
false |
Dans un pipeline, verify_emails accepte tout nœud amont qui émet email (typiquement emails ou import). Sa sortie verified peut alimenter un nœud filter ou sort en aval — filtrez sur status pour ne garder que les lignes délivrables (ex. status ∈ valid, valid_catch_all). Les nœuds d'enrichissement ne peuvent pas s'exécuter après verify_emails : le rapport de vérif ne porte pas les colonnes POI complètes qu'ils requièrent.
Endpoints
Créer un job
POST /api/jobs/verify-emails
Body :
{
"items": [
{ "email": "alex@example.com", "nom": "Alex", "site_web": "https://example.com" },
{ "email": "contact@example.org" }
],
"source_job_id": "f3c2…"
}
source_job_id est optionnel. items est requis, avec au moins un enregistrement et au plus 10000.
Réponse : JobPublic (l'enveloppe de job standard).
Lire un job
Les endpoints de job standard s'appliquent :
GET /api/jobs/{id}
GET /api/jobs/{id}/events # flux SSE
GET /api/jobs/{id}/download # CSV
Pour les caps par job et par compte, voir Limites. Le débit est limité à environ cinq vérifications par seconde pour que l'IP sortante ne soit pas flaggée par les fournisseurs mail. Concurrence : le job tourne sur le pool de workers parallèle ; un verify_emails ne bloque jamais un scraping et n'est jamais bloqué par lui.
Erreurs
| Code | Condition |
|---|---|
| 400 | Aucun email valide dans la liste — items vide, toutes les entrées sans @, ou toutes en doublon |
| 400 | Quota dépassé — coût estimé supérieur à MAX_EF_PER_JOB |
| 401 | L'appelant n'est pas un utilisateur actif |
| 422 | Le payload ne correspond pas à VerifyEmailsJobCreateRequest |
Les échecs par item (timeout MX, sonde SMTP refusée, etc.) ne font pas échouer le job. La ligne est écrite avec status = unknown et le job avance.
Pour aller plus loin
- delivery_check — confirme que le serveur récepteur a réellement accepté une livraison de test, au-delà du handshake SMTP.
- filter — ne garder que les lignes délivrables en filtrant sur
status(valid/valid_catch_all), puis passer le résultat à une campagne ou un export.