PHP code example of willvincent / laravel-email-verifier
1. Go to this page and download the library: Download willvincent/laravel-email-verifier library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
willvincent / laravel-email-verifier example snippets
namespace App\EmailVerification;
use Illuminate\Contracts\Config\Repository as ConfigRepository;
use Illuminate\Http\Client\Factory as HttpFactory;
use WillVincent\EmailVerifier\Contracts\ExternalEmailVerifier;
use WillVincent\EmailVerifier\Results\EmailVerificationResult;
class CustomEmailVerifier implements ExternalEmailVerifier
{
public function __construct(
private HttpFactory $http,
private ConfigRepository $config,
) {}
public function verify(string $email): EmailVerificationResult
{
$apiKey = $this->config->get('email-verifier.external.custom.api_key', '');
$endpoint = $this->config->get('email-verifier.external.custom.endpoint', '');
$timeout = $this->config->get('email-verifier.external.timeout_seconds', 5);
// Return accepted with reduced score if not configured
if ($apiKey === '' || $endpoint === '') {
return new EmailVerificationResult(
accepted: true,
score: 100,
normalizedEmail: $email,
reasons: [],
meta: ['provider' => 'custom', 'configured' => false],
);
}
try {
$response = $this->http
->timeout($timeout)
->retry(1, 250)
->post($endpoint, [
'email' => $email,
'api_key' => $apiKey,
]);
if (!$response->ok()) {
// Fail-open: accept with reduced score
return new EmailVerificationResult(
accepted: true,
score: 90,
normalizedEmail: $email,
reasons: ['external_provider_unavailable'],
meta: ['provider' => 'custom', 'http_status' => $response->status()],
);
}
$data = $response->json() ?? [];
$status = $data['status'] ?? 'unknown';
// Map provider status to scores
return match ($status) {
'valid' => new EmailVerificationResult(
accepted: true,
score: 100,
normalizedEmail: $email,
meta: ['provider' => 'custom', 'status' => $status],
),
'invalid' => new EmailVerificationResult(
accepted: false,
score: 0,
normalizedEmail: $email,
reasons: ['external_rejected:invalid'],
meta: ['provider' => 'custom', 'status' => $status],
),
'risky' => new EmailVerificationResult(
accepted: true,
score: 75,
normalizedEmail: $email,
reasons: ['external_risky'],
meta: ['provider' => 'custom', 'status' => $status],
),
default => new EmailVerificationResult(
accepted: true,
score: 80,
normalizedEmail: $email,
reasons: ['external_unknown'],
meta: ['provider' => 'custom', 'status' => $status],
),
};
} catch (\Throwable $e) {
// Fail-open on exceptions
return new EmailVerificationResult(
accepted: true,
score: 90,
normalizedEmail: $email,
reasons: ['external_exception'],
meta: ['provider' => 'custom', 'error' => $e->getMessage()],
);
}
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use WillVincent\EmailVerifier\External\ExternalEmailVerifierManager;
use App\EmailVerification\CustomEmailVerifier;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
$this->app->extend(ExternalEmailVerifierManager::class, function ($manager, $app) {
$manager->extend('custom', function () use ($app) {
return $app->make(CustomEmailVerifier::class);
});
return $manager;
});
}
}
use WillVincent\EmailVerifier\Contracts\EmailVerifierContract;
class UserController extends Controller
{
public function __construct(
private EmailVerifierContract $verifier
) {}
public function store(Request $request)
{
$result = $this->verifier->verify($request->email);
if ($result->score < 90) {
return back()->withErrors([
'email' => 'Please provide a high-quality email address.'
]);
}
// Proceed with user registration
}
}
'custom' => [
'email' => [
'verified_email' => 'The :attribute address appears to be invalid or temporary.',
],
],
interface Rule
{
public function apply(
VerificationContext $ctx,
EmailVerificationResult $result
): void;
}
use Illuminate\Support\Facades\Queue;
use WillVincent\EmailVerifier\Facades\EmailVerifier;
class RegisterController extends Controller
{
public function store(Request $request)
{
// Quick validation without external provider (< 50ms)
$request->validate([
'email' => ['()->route('verify-email-notice');
}
}
namespace App\Jobs;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use WillVincent\EmailVerifier\Facades\EmailVerifier;
class VerifyUserEmailJob implements ShouldQueue
{
use Queueable;
public function __construct(
public User $user
) {}
public function handle(): void
{
// Full verification with external provider
$result = EmailVerifier::verify($this->user->email);
if ($result->accepted && $result->score >= 80) {
// Email looks good - allow user to proceed
$this->user->update([
'email_verification_score' => $result->score,
]);
} else {
// Email suspicious -
// Fast validation (< 50ms) - perfect for forms
$request->validate([
'email' => ['_email:70,no_external',
]);
class NewsletterSubscriptionRequest extends FormRequest
{
public function rules(): array
{
return [
// Fast validation for most users
'email' => ['
use Illuminate\Support\Facades\Cache;
public function verifyEmail(string $email): EmailVerificationResult
{
return Cache::remember(
"email_verification:{$email}",
now()->addHours(24),
fn () => EmailVerifier::verify($email)
);
}
use Illuminate\Support\Collection;
Collection::chunk($emails, 100)->each(function ($chunk) {
dispatch(new BulkVerifyEmailsJob($chunk));
});