ChartQuery

Valider un email à l'inscription

Vérifiez si une adresse email est réelle et délivrable au moment de l'inscription avec l'API de validation email Veille — syntaxe, DNS et vérification de boîte aux lettres incluses.

Vue d'ensemble

Ce guide montre comment effectuer une validation complète d'email avant d'accepter une inscription : vérification de syntaxe, recherche DNS/MX et accessibilité SMTP. L'API retourne un risk_score (0 = propre, 100 = risque élevé) utilisable pour orienter les utilisateurs vers des étapes de vérification supplémentaires.

Prérequis

  • Une clé API Veille — obtenez-en une sur app.veille.io
  • Installez les dépendances pour votre langage :
pip install requests

Aucune dépendance supplémentaire — utilise l'API native fetch (Node 18+).

Extension curl activée (par défaut).

Aucune dépendance supplémentaire — utilise net/http (Go 1.18+).

Aucune dépendance supplémentaire — utilise java.net.http (Java 11+).

Aucune dépendance supplémentaire — utilise System.Net.Http (.NET 6+).

# Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde_json = "1"

Étapes

Valider une adresse email

Appelez GET /v1/email avec le paramètre email.

import requests

API_KEY  = "YOUR_API_KEY"
response = requests.get(
    "https://api.veille.io/v1/email",
    headers={"x-api-key": API_KEY},
    params={"email": "[email protected]"},
)
result = response.json()
print(result)
const API_KEY = "YOUR_API_KEY";

const params   = new URLSearchParams({ email: "[email protected]" });
const response = await fetch(`https://api.veille.io/v1/email?${params}`, {
  headers: { "x-api-key": API_KEY },
});
const result = await response.json();
console.log(result);
<?php
$apiKey = "YOUR_API_KEY";
$params = http_build_query(["email" => "[email protected]"]);

$ch = curl_init("https://api.veille.io/v1/email?{$params}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: {$apiKey}"]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($result);
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
)

func main() {
    params := url.Values{"email": {"[email protected]"}}
    req, _ := http.NewRequest("GET", "https://api.veille.io/v1/email?"+params.Encode(), nil)
    req.Header.Set("x-api-key", "YOUR_API_KEY")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)

    var result map[string]any
    json.Unmarshal(body, &result)
    fmt.Println(result)
}
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;

var client  = HttpClient.newHttpClient();
var email   = URLEncoder.encode("[email protected]", StandardCharsets.UTF_8);
var request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.veille.io/v1/email?email=" + email))
    .header("x-api-key", "YOUR_API_KEY")
    .GET().build();

var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var email = Uri.EscapeDataString("[email protected]");
var body  = await client.GetStringAsync($"https://api.veille.io/v1/email?email={email}");
Console.WriteLine(body);
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let result = reqwest::Client::new()
        .get("https://api.veille.io/v1/email")
        .header("x-api-key", "YOUR_API_KEY")
        .query(&[("email", "[email protected]")])
        .send().await?.json::<serde_json::Value>().await?;

    println!("{:#?}", result);
    Ok(())
}

Interpréter le résultat

Champs clés : is_valid, is_deliverable, is_disposable, is_role_account, risk_score, did_you_mean (suggestion de faute de frappe).

print(f"Valide      : {result['is_valid']}")
print(f"Délivrable  : {result['is_deliverable']}")
print(f"Jetable     : {result['is_disposable']}")
print(f"Compte rôle : {result['is_role_account']}")
print(f"Score risque: {result['risk_score']}/100")
if result.get("did_you_mean"):
    print(f"Vouliez-vous dire : {result['did_you_mean']} ?")
console.log(`Valide      : ${result.is_valid}`);
console.log(`Délivrable  : ${result.is_deliverable}`);
console.log(`Jetable     : ${result.is_disposable}`);
console.log(`Compte rôle : ${result.is_role_account}`);
console.log(`Score risque: ${result.risk_score}/100`);
if (result.did_you_mean) console.log(`Vouliez-vous dire : ${result.did_you_mean} ?`);
echo "Valide      : " . ($result["is_valid"]       ? "true" : "false") . "\n";
echo "Délivrable  : " . ($result["is_deliverable"]  ? "true" : "false") . "\n";
echo "Jetable     : " . ($result["is_disposable"]   ? "true" : "false") . "\n";
echo "Score risque: {$result['risk_score']}/100\n";
if (!empty($result["did_you_mean"])) echo "Vouliez-vous dire : {$result['did_you_mean']} ?\n";
fmt.Printf("Valide      : %v\nDélivrable  : %v\nJetable     : %v\nScore risque: %v/100\n",
    result["is_valid"], result["is_deliverable"], result["is_disposable"], result["risk_score"])
if typo, ok := result["did_you_mean"].(string); ok && typo != "" {
    fmt.Println("Vouliez-vous dire :", typo+"?")
}
import org.json.*;

var r = new JSONObject(response.body());
System.out.printf("Valide      : %b%nDélivrable  : %b%nJetable     : %b%nScore risque: %d/100%n",
    r.getBoolean("is_valid"), r.getBoolean("is_deliverable"),
    r.getBoolean("is_disposable"), r.getInt("risk_score"));
if (r.has("did_you_mean")) System.out.println("Vouliez-vous dire : " + r.getString("did_you_mean") + "?");
using System.Text.Json;

var r = JsonDocument.Parse(body).RootElement;
Console.WriteLine($"Valide      : {r.GetProperty("is_valid").GetBoolean()}");
Console.WriteLine($"Délivrable  : {r.GetProperty("is_deliverable").GetBoolean()}");
Console.WriteLine($"Jetable     : {r.GetProperty("is_disposable").GetBoolean()}");
Console.WriteLine($"Score risque: {r.GetProperty("risk_score").GetInt32()}/100");
if (r.TryGetProperty("did_you_mean", out var typo) && typo.GetString() is { } t and not "")
    Console.WriteLine($"Vouliez-vous dire : {t} ?");
println!("Valide      : {}", result["is_valid"]);
println!("Délivrable  : {}", result["is_deliverable"]);
println!("Jetable     : {}", result["is_disposable"]);
println!("Score risque: {}/100", result["risk_score"]);
if let Some(typo) = result["did_you_mean"].as_str() {
    if !typo.is_empty() { println!("Vouliez-vous dire : {} ?", typo); }
}

Construire un flux d'inscription par niveau de risque

Utilisez risk_score pour router les utilisateurs : bloquer les adresses à haut risque, proposer des corrections de fautes de frappe, et appliquer une friction supplémentaire aux comptes rôle.

import requests

API_KEY = "YOUR_API_KEY"

def validate_email(email: str) -> dict:
    r = requests.get("https://api.veille.io/v1/email",
        headers={"x-api-key": API_KEY}, params={"email": email})
    return r.json()

def register(email: str) -> dict:
    v = validate_email(email)

    if not v.get("is_valid"):
        return {"ok": False, "error": "Cette adresse email est invalide."}

    if v.get("is_disposable"):
        return {"ok": False, "error": "Les adresses email temporaires ne sont pas acceptées."}

    if v.get("did_you_mean"):
        return {"ok": False, "suggestion": f"Vouliez-vous dire {v['did_you_mean']} ?"}

    if v.get("risk_score", 0) >= 70:
        return {"ok": False, "error": "Score de risque élevé. Veuillez utiliser une autre adresse."}

    if v.get("is_role_account"):
        return {"ok": True, "flag": "role_account", "message": "Veuillez vérifier votre email."}

    return {"ok": True, "message": "Inscription réussie !"}

for test_email in ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]:
    print(f"{test_email}: {register(test_email)}")
const API_KEY = "YOUR_API_KEY";

async function validateEmail(email: string) {
  const params = new URLSearchParams({ email });
  const res    = await fetch(`https://api.veille.io/v1/email?${params}`, {
    headers: { "x-api-key": API_KEY },
  });
  return res.json();
}

async function register(email: string) {
  const v = await validateEmail(email);
  if (!v.is_valid)       return { ok: false, error: "Adresse email invalide." };
  if (v.is_disposable)   return { ok: false, error: "Emails temporaires non acceptés." };
  if (v.did_you_mean)    return { ok: false, suggestion: `Vouliez-vous dire ${v.did_you_mean} ?` };
  if (v.risk_score >= 70) return { ok: false, error: "Score de risque élevé — utilisez une autre adresse." };
  if (v.is_role_account) return { ok: true,  flag: "role_account", message: "Veuillez vérifier votre email." };
  return { ok: true, message: "Inscription réussie !" };
}

for (const email of ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]) {
  console.log(email, await register(email));
}
<?php
function validateEmail(string $apiKey, string $email): array {
    $params = http_build_query(["email" => $email]);
    $ch = curl_init("https://api.veille.io/v1/email?{$params}");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-api-key: {$apiKey}"]);
    $result = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $result;
}

function register(string $apiKey, string $email): array {
    $v = validateEmail($apiKey, $email);
    if (!($v["is_valid"]      ?? false)) return ["ok" => false, "error" => "Email invalide."];
    if ($v["is_disposable"]   ?? false)  return ["ok" => false, "error" => "Emails temporaires non acceptés."];
    if (!empty($v["did_you_mean"]))      return ["ok" => false, "suggestion" => "Vouliez-vous dire {$v['did_you_mean']} ?"];
    if (($v["risk_score"]     ?? 0) >= 70) return ["ok" => false, "error" => "Score de risque élevé."];
    if ($v["is_role_account"] ?? false)  return ["ok" => true,  "flag" => "role_account"];
    return ["ok" => true, "message" => "Inscription réussie !"];
}

foreach (["[email protected]", "[email protected]", "[email protected]"] as $email) {
    print_r(["email" => $email, "result" => register("YOUR_API_KEY", $email)]);
}
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
)

const APIKey = "YOUR_API_KEY"

func validate(email string) map[string]any {
    params := url.Values{"email": {email}}
    req, _ := http.NewRequest("GET", "https://api.veille.io/v1/email?"+params.Encode(), nil)
    req.Header.Set("x-api-key", APIKey)
    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    var v map[string]any
    json.Unmarshal(body, &v)
    return v
}

func register(email string) string {
    v := validate(email)
    if !(v["is_valid"].(bool))    { return "❌ Email invalide." }
    if v["is_disposable"].(bool)  { return "❌ Email temporaire non accepté." }
    if typo, ok := v["did_you_mean"].(string); ok && typo != "" {
        return "⚠️  Vouliez-vous dire " + typo + " ?"
    }
    if v["risk_score"].(float64) >= 70 { return "❌ Score de risque élevé." }
    return "✅ Inscription réussie !"
}

func main() {
    for _, email := range []string{"[email protected]", "[email protected]", "[email protected]"} {
        fmt.Printf("%s: %s\n", email, register(email))
    }
}
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import org.json.*;

public class Main {
    static HttpClient client = HttpClient.newHttpClient();
    static String API_KEY   = "YOUR_API_KEY";

    static JSONObject validate(String email) throws Exception {
        var encoded = URLEncoder.encode(email, StandardCharsets.UTF_8);
        var req     = HttpRequest.newBuilder()
            .uri(URI.create("https://api.veille.io/v1/email?email=" + encoded))
            .header("x-api-key", API_KEY).GET().build();
        var resp    = client.send(req, HttpResponse.BodyHandlers.ofString());
        return new JSONObject(resp.body());
    }

    static String register(String email) throws Exception {
        var v = validate(email);
        if (!v.getBoolean("is_valid"))      return "❌ Email invalide.";
        if (v.getBoolean("is_disposable"))  return "❌ Email temporaire non accepté.";
        if (v.has("did_you_mean"))          return "⚠️  Vouliez-vous dire " + v.getString("did_you_mean") + " ?";
        if (v.getInt("risk_score") >= 70)   return "❌ Score de risque élevé.";
        return "✅ Inscription réussie !";
    }

    public static void main(String[] args) throws Exception {
        for (var email : new String[]{"[email protected]", "[email protected]", "[email protected]"}) {
            System.out.printf("%s: %s%n", email, register(email));
        }
    }
}
using System.Net.Http;
using System.Text.Json;

var apiKey = "YOUR_API_KEY";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", apiKey);

async Task<JsonElement> Validate(string email)
{
    var encoded = Uri.EscapeDataString(email);
    var body    = await client.GetStringAsync($"https://api.veille.io/v1/email?email={encoded}");
    return JsonDocument.Parse(body).RootElement;
}

async Task<string> Register(string email)
{
    var v = await Validate(email);
    if (!v.GetProperty("is_valid").GetBoolean())                      return "❌ Email invalide.";
    if (v.GetProperty("is_disposable").GetBoolean())                  return "❌ Email temporaire non accepté.";
    if (v.TryGetProperty("did_you_mean", out var t) && t.GetString() is { Length: > 0 } typo)
                                                                      return $"⚠️  Vouliez-vous dire {typo} ?";
    if (v.GetProperty("risk_score").GetInt32() >= 70)                 return "❌ Score de risque élevé.";
    return "✅ Inscription réussie !";
}

foreach (var email in new[] { "[email protected]", "[email protected]", "[email protected]" })
    Console.WriteLine($"{email}: {await Register(email)}");
use reqwest::Client;
use serde_json::Value;

const API_KEY: &str = "YOUR_API_KEY";

async fn validate(client: &Client, email: &str) -> Value {
    client.get("https://api.veille.io/v1/email")
        .header("x-api-key", API_KEY)
        .query(&[("email", email)])
        .send().await.unwrap().json::<Value>().await.unwrap()
}

async fn register(client: &Client, email: &str) -> &'static str {
    let v = validate(client, email).await;
    if !v["is_valid"].as_bool().unwrap_or(false)     { return "❌ Email invalide."; }
    if  v["is_disposable"].as_bool().unwrap_or(false) { return "❌ Email temporaire non accepté."; }
    if  v["risk_score"].as_i64().unwrap_or(0) >= 70  { return "❌ Score de risque élevé."; }
    "✅ Inscription réussie !"
}

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = Client::new();
    for email in ["[email protected]", "[email protected]", "[email protected]"] {
        println!("{}: {}", email, register(&client, email).await);
    }
    Ok(())
}

Les comptes rôle (admin@, info@, support@) sont souvent surveillés par plusieurs personnes — ou pas du tout. Marquez-les pour révision manuelle plutôt que de les bloquer, afin de ne pas perdre d'inscriptions B2B légitimes.

Sur cette page