Biblioteca PHP — Paquete de Composer
composer require nsoftware/email-validator-php
Cliente de API con tipos seguros para email-validaton.com. Asíncrono, con caché y listo para Laravel.
Instalación
composer require nsoftware/email-validator-php
Requisitos: PHP 8.1+, Guzzle 7, caché PSR-6 (opcional), logger PSR-3 (opcional).
Inicio rápido
<?php
require 'vendor/autoload.php';
use NSoftware\EmailValidator\Client;
$client = new Client('ev_your_api_key');
// Verify one email
$result = $client->verify('user@example.com');
if ($result->isValid()) {
echo "Valid — confidence: {$result->confidence}";
}
if ($result->isDisposable()) {
echo "Disposable email — reject!";
}
Verificación asíncrona
$client->verifyAsync('user@domain.com')
->then(fn($result) => echo $result->status);
// Bulk async with controlled concurrency
$client->verifyBulkAsync($emails, concurrency: 10)
->then(function(array $results) {
foreach ($results as $email => $r) {
echo "$email: {$r->status}\n";
}
});
Caché PSR-6
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
$cache = new FilesystemAdapter('email-validator', 300);
$client = new Client('ev_...', cache: $cache);
// Account info auto-cached for 5 min
$account = $client->getAccount();
// Force refresh
$account = $client->getAccount(forceRefresh: true);
DTOs con tipos seguros
| Clase | Propiedades |
|---|---|
VerificationResult |
email, status, reason, confidence, mxServer, mxList, smtpResponse, sourceIp, durationMs, remainingCredits, isYahoo |
AccountInfo |
email, plan, planName, creditsRemaining, creditsUsed, creditsLimit, planType, subscriptionActive, subscriptionCancelled, subscriptionExpires, freeRemaining, totalRemaining, isAdmin |
CreditInfo |
hasCredits, creditsRemaining |
Cada DTO tiene un método estático fromApiResponse(array) factory and toArray() serialization.
Predicados prácticos
| Método | Devuelve | Explicación |
|---|---|---|
isValid() | bool | status === 'valid' |
isInvalid() | bool | status === 'invalid' |
isRisky() | bool | status === 'risky' |
isCatchAll() | bool | status === 'catch_all' |
isDisposable() | bool | status === 'disposable' |
isDeliverable() | bool | valid || risky || catch_all |
costCredit() | bool | valid || invalid || over_quota || disposable |
Integración con Laravel
El paquete se registra solo mediante el auto-descubrimiento de Laravel. Basta con añadir tu clave de API a .env:
EMAIL_VALIDATOR_API_KEY=ev_your_key
Ahora usa la inyección de dependencias o la fachada en cualquier lugar:
use NSoftware\EmailValidator\Client;
use EmailValidator; // Facade alias
class SignupController
{
public function store(Request $request, Client $validator)
{
$result = $validator->verify($request->email);
if (!$result->isDeliverable()) {
return back()->withErrors(['email' => 'Invalid email']);
}
// Create user...
}
}
// Or with the facade:
$result = EmailValidator::verify('user@example.com');
$account = EmailValidator::getAccount();
Gestión de errores
| Excepción | HTTP | Cuándo |
|---|---|---|
AuthenticationException | 401/403 | Clave de API incorrecta o ausente |
RateLimitException | 429 | 60 peticiones/min o límite por hora. $e->retryAfterSeconds |
NoCreditsException | 429 | Créditos agotados |
ApiException | -- | Error de red, respuesta inesperada |
try {
$result = $client->verify('user@example.com');
} catch (RateLimitException $e) {
sleep($e->retryAfterSeconds);
// retry
} catch (NoCreditsException $e) {
// prompt user to upgrade
} catch (ApiException $e) {
logger()->error("Validation failed: {$e->getMessage()}");
}
Contenido del paquete
| Carpeta | Descripción |
|---|---|
src/Client.php | Cliente principal de API con métodos síncronos y asíncronos |
src/Data/ | DTO inmutables (VerificationResult, AccountInfo, CreditInfo) |
src/Exceptions/ | Excepciones tipadas con códigos HTTP |
src/Laravel/ | Proveedor de servicios, fachada, configuración publicable |
tests/ | Pruebas con PHPUnit |
config/ | Configuración de Laravel (publicar con artisan) |
v5.0.0 · Licencia MIT · PHP 8.1+ · Guzzle 7 · PSR-6 / PSR-3