Python SDK
Python email checker SDK. pip install, verify emails with Python. Code examples and async support.
Le SDK officiel EmailVerify pour Python fournit des interfaces synchrones et asynchrones pour la vérification d'emails.
Installation
pip install emailverifyAvec Support Async
pip install emailverify[async]Démarrage Rapide
import os
from emailverify import Client
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
# Vérifier un seul email
result = client.verify('user@example.com')
print(f"Status: {result.status}") # 'valid', 'invalid', 'unknown', or 'accept_all'Configuration
Options du Client
from emailverify import Client
client = Client(
api_key='your-api-key',
# Configurations optionnelles
timeout=30, # Délai de requête en secondes
retries=3, # Nombre de tentatives
base_url='https://api.emailverify.ai', # URL API personnalisée
)Variables d'Environnement
# .env
EMAILVERIFY_API_KEY=your_api_key_hereimport os
from emailverify import Client
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])Vérification d'Email Unique
Vérification Basique
result = client.verify('user@example.com')
print({
'email': result.email,
'status': result.status,
'score': result.score,
'deliverable': result.result.deliverable,
'disposable': result.result.disposable,
'role': result.result.role,
})Vérification avec Options
result = client.verify(
'user@example.com',
smtp_check=True, # Activer la vérification SMTP
timeout=5, # Délai personnalisé pour cette requête
)Objet de Réponse
@dataclass
class VerificationResult:
email: str
status: str # 'valid', 'invalid', 'unknown', 'accept_all'
result: ResultDetails
score: float
reason: Optional[str]
@dataclass
class ResultDetails:
deliverable: Optional[bool]
valid_format: bool
valid_domain: bool
valid_mx: bool
disposable: bool
role: bool
catchall: bool
free: bool
smtp_valid: Optional[bool]Utilisation Async
Pour les applications haute performance, utilisez le client async :
import asyncio
from emailverify import AsyncClient
async def main():
client = AsyncClient(api_key=os.environ['EMAILVERIFY_API_KEY'])
# Vérification unique
result = await client.verify('user@example.com')
print(result.status)
# Vérifier plusieurs emails de manière concurrente
emails = ['user1@example.com', 'user2@example.com', 'user3@example.com']
results = await asyncio.gather(*[client.verify(email) for email in emails])
for result in results:
print(f"{result.email}: {result.status}")
await client.close()
asyncio.run(main())Gestionnaire de Contexte
async with AsyncClient(api_key=os.environ['EMAILVERIFY_API_KEY']) as client:
result = await client.verify('user@example.com')Vérification en Masse
Soumettre une Tâche en Masse
emails = [
'user1@example.com',
'user2@example.com',
'user3@example.com',
]
job = client.verify_bulk(emails)
print(f"Job ID: {job.id}")
print(f"Status: {job.status}")Vérifier le Statut de la Tâche
status = client.get_bulk_job_status(job.id)
print({
'id': status.id,
'status': status.status, # 'pending', 'processing', 'completed', 'failed'
'total': status.total,
'processed': status.processed,
'valid': status.valid,
'invalid': status.invalid,
})Obtenir les Résultats
results = client.get_bulk_job_results(job.id)
for result in results:
print(f"{result.email}: {result.status}")Avec Webhook
job = client.verify_bulk(
emails,
webhook_url='https://your-domain.com/webhooks/emailverify',
)Gestion des Crédits
credits = client.get_credits()
print({
'available': credits.available,
'used': credits.used,
'total': credits.total,
})Gestion des Erreurs
Types d'Exceptions
from emailverify import (
Client,
EmailVerifyError,
AuthenticationError,
RateLimitError,
ValidationError,
)
try:
result = client.verify('invalid-email')
except AuthenticationError:
print('Invalid API key')
except RateLimitError as e:
print(f'Rate limited. Retry after {e.retry_after} seconds')
except ValidationError as e:
print(f'Invalid input: {e}')
except EmailVerifyError as e:
print(f'API error: {e}')Configuration de Nouvelle Tentative
client = Client(
api_key=os.environ['EMAILVERIFY_API_KEY'],
retries=5,
retry_delay=1.0, # Initial delay in seconds
retry_max_delay=30.0, # Max delay between retries
)Intégration avec les Frameworks
Django
# views.py
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from emailverify import Client
import os
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
@require_POST
def verify_email(request):
import json
data = json.loads(request.body)
email = data.get('email')
try:
result = client.verify(email)
if result.status == 'invalid':
return JsonResponse({
'valid': False,
'message': 'Please enter a valid email address',
}, status=400)
if result.result.disposable:
return JsonResponse({
'valid': False,
'message': 'Disposable emails are not allowed',
}, status=400)
return JsonResponse({'valid': True, 'score': result.score})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)Validation de Formulaire Django
# forms.py
from django import forms
from emailverify import Client
import os
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
class RegistrationForm(forms.Form):
email = forms.EmailField()
def clean_email(self):
email = self.cleaned_data['email']
result = client.verify(email)
if result.status == 'invalid':
raise forms.ValidationError('Please enter a valid email address')
if result.result.disposable:
raise forms.ValidationError('Disposable emails are not allowed')
return emailFlask
from flask import Flask, request, jsonify
from emailverify import Client
import os
app = Flask(__name__)
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
@app.route('/verify', methods=['POST'])
def verify_email():
email = request.json.get('email')
try:
result = client.verify(email)
return jsonify({
'email': result.email,
'status': result.status,
'score': result.score,
})
except Exception as e:
return jsonify({'error': str(e)}), 500FastAPI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from emailverify import AsyncClient
import os
app = FastAPI()
client = AsyncClient(api_key=os.environ['EMAILVERIFY_API_KEY'])
class EmailRequest(BaseModel):
email: str
@app.post('/verify')
async def verify_email(request: EmailRequest):
try:
result = await client.verify(request.email)
return {
'email': result.email,
'status': result.status,
'score': result.score,
'deliverable': result.result.deliverable,
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.on_event('shutdown')
async def shutdown():
await client.close()Exemples Complets
Validation d'Inscription Utilisateur
from emailverify import Client
import os
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
def validate_registration_email(email: str) -> dict:
"""Valider l'email pour l'inscription utilisateur."""
result = client.verify(email)
# Reject invalid emails
if result.status == 'invalid':
return {
'valid': False,
'reason': 'invalid_email',
'message': 'This email address is invalid',
}
# Reject disposable emails
if result.result.disposable:
return {
'valid': False,
'reason': 'disposable',
'message': 'Please use a permanent email address',
}
# Warn about role-based emails
if result.result.role:
return {
'valid': True,
'warning': 'role_based',
'message': 'Using a personal email is recommended',
}
return {
'valid': True,
'score': result.score,
}
# Utilisation
validation = validate_registration_email('user@example.com')
if not validation['valid']:
print(validation['message'])Nettoyage de Liste en Masse
import csv
from emailverify import Client
import os
client = Client(api_key=os.environ['EMAILVERIFY_API_KEY'])
def clean_email_list(input_file: str, output_file: str):
"""Nettoyer une liste d'emails et exporter les résultats."""
# Lire les emails depuis CSV
with open(input_file, 'r') as f:
reader = csv.DictReader(f)
emails = [row['email'] for row in reader]
# Soumettre vérification en masse
job = client.verify_bulk(emails)
print(f"Submitted job {job.id} with {len(emails)} emails")
# Attendre la fin (interrogation)
import time
while True:
status = client.get_bulk_job_status(job.id)
print(f"Progress: {status.processed}/{status.total}")
if status.status == 'completed':
break
elif status.status == 'failed':
raise Exception(f"Job failed: {status.error}")
time.sleep(5)
# Obtenir les résultats et écrire vers la sortie
results = client.get_bulk_job_results(job.id)
with open(output_file, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['email', 'status', 'score', 'disposable'])
writer.writeheader()
for result in results:
writer.writerow({
'email': result.email,
'status': result.status,
'score': result.score,
'disposable': result.result.disposable,
})
print(f"Results written to {output_file}")
print(f"Valid: {status.valid}, Invalid: {status.invalid}")
# Utilisation
clean_email_list('contacts.csv', 'cleaned_contacts.csv')Vérification Concurrente Async
import asyncio
from emailverify import AsyncClient
import os
async def verify_emails_concurrent(emails: list[str], concurrency: int = 10):
"""Vérifier plusieurs emails avec concurrence contrôlée."""
client = AsyncClient(api_key=os.environ['EMAILVERIFY_API_KEY'])
semaphore = asyncio.Semaphore(concurrency)
async def verify_with_semaphore(email):
async with semaphore:
return await client.verify(email)
tasks = [verify_with_semaphore(email) for email in emails]
results = await asyncio.gather(*tasks, return_exceptions=True)
await client.close()
# Process results
valid = []
invalid = []
errors = []
for email, result in zip(emails, results):
if isinstance(result, Exception):
errors.append((email, str(result)))
elif result.status == 'valid':
valid.append(email)
else:
invalid.append(email)
return {
'valid': valid,
'invalid': invalid,
'errors': errors,
}
# Utilisation
emails = ['user1@example.com', 'user2@example.com', 'user3@example.com']
results = asyncio.run(verify_emails_concurrent(emails))
print(f"Valid: {len(results['valid'])}, Invalid: {len(results['invalid'])}")Annotations de Type
Le SDK inclut des annotations de type complètes pour le support IDE :
from emailverify import Client, VerificationResult, BulkJob
from typing import Optional
def process_verification(result: VerificationResult) -> Optional[str]:
if result.status == 'valid':
return result.email
return None