PHP code example of harungecit / php-email-validator

1. Go to this page and download the library: Download harungecit/php-email-validator 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/ */

    

harungecit / php-email-validator example snippets


$validator = HarunGecit\EmailValidator\EmailValidator::create();

$validator->isValid('[email protected]');                  // true  — format, disposable and MX checks
$validator->isDisposable('[email protected]');         // true
$validator->checkDisposable('[email protected]')       // explains *why*:
          ->getMatchedDomain();                          // 'mailinator.com' (subdomain match)
$validator->validate('[email protected]')->getSuggestion(); // '[email protected]' (with typo suggestions on)

use HarunGecit\EmailValidator\EmailValidator;

$validator = EmailValidator::create();          // format + disposable + MX checks

if (!$validator->isValid($email)) {
    // reject
}

// Detailed report
$result = $validator->validate('[email protected]');

$result->isValid();       // false
$result->getErrors();     // ['Disposable email address']
$result->getChecks();     // ['format' => true, 'disposable' => false, 'mx' => true]
$result->getMetadata();   // ['disposable_match' => 'mailinator.com', 'disposable_source' => 'blocklist']

$validator = EmailValidator::basic();           // format + disposable only
$validator->isValid('[email protected]');        // false

$validator->isDisposable('[email protected]');      // true  (email address)
$validator->isDisposableDomain('mailinator.com');      // true  (bare domain)

$check = $validator->checkDisposable('[email protected]');
$check->isDisposable();      // true
$check->getDomain();         // 'eu.mailinator.com' (normalized: lowercase, trailing dot removed, IDN → punycode)
$check->getMatchedDomain();  // 'mailinator.com'
$check->isSubdomainMatch();  // true
$check->getSource();         // 'blocklist' | 'custom' | 'synced' | 'allowlist' | null
$check->isAllowlisted();     // false
$check->toArray();           // JSON-serializable

use HarunGecit\EmailValidator\Config\ConfigurationBuilder;

$config = ConfigurationBuilder::create()
    ->basic()
    ->withCustomBlocklist(['competitor-trials.example'])     // block more
    ->withCustomAllowlist(['partner.mailinator.com'])        // allow exceptions
    ->withCustomBlocklistFiles([__DIR__ . '/lists'])         // *.conf, *.txt, *.list, *.json files or directories
    ->withoutSubdomainBlocking()                             // optional: exact matches only
    ->build();

$validator = EmailValidator::withConfig($config);

$config = ConfigurationBuilder::create()
    ->standard()
    ->withSyncedBlocklist(__DIR__ . '/var/email-validator/synced-blocklist.txt')
    ->build();

use HarunGecit\EmailValidator\Sync\ListSynchronizer;

$result = (new ListSynchronizer($config))->sync(replace: false);
$result->isSuccessful(); $result->getAdded(); $result->getTotal(); $result->getErrors();

$validator = EmailValidator::strict();   // ConfigurationBuilder::create()->strict()->build()
$validator = EmailValidator::basic();

ConfigurationBuilder::create()->standard()->withFormatMode('rfc')->withSpoofCheck()->build();

$validator->isSpoofed('[email protected]');   // true  — "gmаil.com" with a Cyrillic "а"
$validator->isSpoofed("p\u{0430}[email protected]"); // true  — mixed-script local part
$validator->isSpoofed('ivan@почта.рф');           // false — one script per part is legitimate

$validator->isValidFormat('[email protected]');
$validator->hasValidMX('[email protected]');        // MX records (cached)
$validator->hasValidDNS('[email protected]');       // A / AAAA records
$validator->isRoleBased('[email protected]');
$validator->isSubaddressed('[email protected]');
$validator->getBaseEmail('[email protected]');    // '[email protected]'
$validator->isCatchAll('[email protected]');
$validator->validateSMTP('[email protected]');
$validator->getSuggestion('[email protected]');       // SuggestionResult: '[email protected]', confidence 0–100

$emails = ['[email protected]', '[email protected]', 'invalid-email'];

$validator->validateBatch($emails);              // array<string, ValidationResult>
$validator->filterValid($emails, false);         // ['[email protected]']  ($checkMX = false)
$validator->filterInvalid($emails, false);
$validator->getStatistics($emails, false);
// ['total' => 3, 'valid' => 1, 'invalid' => 2, 'disposable' => 1, 'invalid_format' => 1, 'no_mx' => 0]

$config = ConfigurationBuilder::create()
    ->standard()
    ->withRoleBasedCheck()
    ->withFileCache(__DIR__ . '/cache', 3600)
    ->withRateLimiting(100, 60)
    ->build();

$validator = EmailValidator::withConfig($config);
$validator = EmailValidator::fromConfigFile(__DIR__ . '/config/emailvalidator.php'); // .php / .json / .yaml
$config    = Configuration::fromArray([...]);                                         // same keys

use HarunGecit\EmailValidator\Framework\Laravel\Rules\NotDisposableEmail;
use HarunGecit\EmailValidator\Framework\Laravel\Rules\NotRoleBasedEmail;
use HarunGecit\EmailValidator\Framework\Laravel\Rules\ValidEmail;

$request->validate([
    'email'      => ['new NotRoleBasedEmail()],
    'other'      => ['

use EmailValidator; // HarunGecit\EmailValidator\Framework\Laravel\EmailValidatorFacade

EmailValidator::isDisposable('[email protected]');                           // true
EmailValidator::checkDisposable('[email protected]')->getMatchedDomain(); // 'mailinator.com'
EmailValidator::validate('[email protected]')->getSuggestion()?->getSuggestedEmail(); // '[email protected]'
EmailValidator::getListStatistics();

'format' => ['mode' => env('EMAIL_VALIDATOR_FORMAT_MODE', 'filter')],
'lists'  => [
    'custom_blocklist'      => ['my-throwaway.com'],
    'custom_allowlist'      => ['my-company.com'],
    'synced_blocklist_path' => storage_path('app/email-validator/synced-blocklist.txt'),
    'block_subdomains'      => true,
],
'sync' => [
    'urls'     => [Configuration::DEFAULT_SYNC_URL],   // EMAIL_VALIDATOR_SYNC_URLS (comma-separated)
    'schedule' => env('EMAIL_VALIDATOR_SYNC_SCHEDULE'), // null|hourly|daily|weekly|monthly|cron expression
],

// config/bundles.php
return [
    HarunGecit\EmailValidator\Framework\Symfony\EmailValidatorBundle::class => ['all' => true],
];

use HarunGecit\EmailValidator\Framework\Symfony\Validator\NotDisposableEmail;
use HarunGecit\EmailValidator\Framework\Symfony\Validator\NotRoleBasedEmail;
use HarunGecit\EmailValidator\Framework\Symfony\Validator\ValidEmail;
use Symfony\Component\Validator\Constraints as Assert;

class SignupDto
{
    #[Assert\NotBlank, Assert\Email, NotDisposableEmail]
    public string $email;

    #[ValidEmail(checkMx: false, message: 'Invalid email: {{ reason }}')]
    public string $workEmail;

    #[NotRoleBasedEmail(groups: ['registration'])]
    public string $contactEmail;
}

$rules = ['email' => 'e($rules)) {
    return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
}

$validator = service('emailValidator');   // shared; single_service('emailValidator') for a new instance
$validator->checkDisposable('[email protected]')->getMatchedDomain(); // 'mailinator.com'

namespace Config;

use HarunGecit\EmailValidator\Framework\CodeIgniter\Config\EmailValidator as BaseEmailValidator;

class EmailValidator extends BaseEmailValidator
{
    public array $lists = [
        'custom_blocklist'      => ['competitor-temp.com'],
        'synced_blocklist_path' => WRITEPATH . 'email-validator/synced.conf',
        'block_subdomains'      => true,
    ];
}

use HarunGecit\EmailValidator\Framework\CakePHP\EmailValidationProvider;

public function validationDefault(Validator $validator): Validator
{
    // One call: registers the "emailValidator" provider and adds the rules
    EmailValidationProvider::attach($validator, 'email', [
        'notDisposable',
        'notRoleBased' => 'Please use a personal email address.',   // custom message
    ]);

    return $validator;
}

// src/Application.php
$this->addPlugin(\HarunGecit\EmailValidator\Framework\CakePHP\EmailValidatorPlugin::class);

// config/app_local.php
'EmailValidator' => [
    'checks' => ['mx' => true, 'role_based' => true],
    'lists'  => ['synced_blocklist_path' => TMP . 'email-validator' . DS . 'synced.conf'],
    'cache'  => ['driver' => 'cakephp', 'options' => ['config' => 'default']],   // optional: use a Cake cache config
],

public function signup(\HarunGecit\EmailValidator\EmailValidator $emailValidator) { /* injected */ }

// config/web.php (and console.php)
'components' => [
    'emailValidator' => [
        'class'  => \HarunGecit\EmailValidator\Framework\Yii2\EmailValidatorComponent::class,
        'config' => [
            'checks' => ['mx' => true, 'role_based' => true],
            'lists'  => ['synced_blocklist_path' => '@runtime/email-validator/synced.conf'],   // aliases are resolved
        ],
    ],
],

use HarunGecit\EmailValidator\Framework\Yii2\NotDisposableEmailValidator;
use HarunGecit\EmailValidator\Framework\Yii2\NotRoleBasedEmailValidator;
use HarunGecit\EmailValidator\Framework\Yii2\VerifiedEmailValidator;

public function rules()
{
    return [
        ['email', 'i::$app->emailValidator->checkDisposable('[email protected]')->getMatchedDomain(); // 'mailinator.com'

use HarunGecit\EmailValidator\Framework\Yii3\NotDisposableEmail;
use HarunGecit\EmailValidator\Framework\Yii3\VerifiedEmail;
use Yiisoft\Validator\Rule\{Email, Required};

final class SignupForm
{
    #[Required, Email, NotDisposableEmail]
    public string $email = '';

    #[VerifiedEmail(skipOnEmpty: true, messages: ['disposable' => 'Please use a permanent email address.'])]
    public string $backupEmail = '';
}

// config/common/di/email-validator.php
return [
    EmailValidator::class => ['__construct()' => [Configuration::fromArray(['checks' => ['mx' => true]])]],
];

use HarunGecit\EmailValidator\Framework\Phalcon\EmailValidatorServiceProvider;
use HarunGecit\EmailValidator\Framework\Phalcon\Validator\NotDisposableEmail;
use HarunGecit\EmailValidator\Framework\Phalcon\Validator\VerifiedEmail;
use Phalcon\Filter\Validation;
use Phalcon\Filter\Validation\Validator\Email;

$di->register(new EmailValidatorServiceProvider([
    'checks' => ['mx' => true],
    'lists'  => ['synced_blocklist_path' => BASE_PATH . '/storage/email-validator/synced.conf'],
]));   // or no argument: reads the "emailValidator" section of the "config" service

$validation = new Validation();
$validation->add('email', new Email());
$validation->add('email', new NotDisposableEmail(['message' => 'Disposable addresses (:domain) are not allowed']));
$validation->add('email', new VerifiedEmail(['messages' => ['mx' => 'The domain of :field cannot receive email']]));

$messages = $validation->validate($_POST);

$validator = EmailValidator::fromConfigFile(__DIR__ . '/config/emailvalidator.php');

ConfigurationBuilder::create()->withMemoryCache(3600);                       // in-process (default)
ConfigurationBuilder::create()->withFileCache('/tmp/ev-cache', 3600);        // filesystem
ConfigurationBuilder::create()->withRedisCache('127.0.0.1', 6379, null, 0);  // ext-redis or Predis
ConfigurationBuilder::create()->withMemcachedCache('127.0.0.1', 11211);      // ext-memcached
ConfigurationBuilder::create()->withPsr16Cache($anyPsr16Cache);              // any PSR-16 cache
ConfigurationBuilder::create()->withoutCache();

CacheManager::registerDriver('my-driver', MyCacheAdapter::class);           // custom drivers

$config = ConfigurationBuilder::create()->standard()->withRateLimiting(maxAttempts: 5, decaySeconds: 60)->build();

try {
    $validator->validate($email);
} catch (RateLimitExceededException $e) {
    echo "Retry after {$e->getRetryAfter()}s";
}
bash
composer 
bash
php artisan email-validator:install     # publishes config/emailvalidator.php (add --translations for the messages)
php artisan email-validator:sync        # download the latest disposable domains
bash
php artisan email-validator:check [email protected] example.org [--json]   # exit 1 if disposable
php artisan email-validator:validate [email protected] [--no-mx] [--json]         # exit 1 if invalid
php artisan email-validator:sync [--replace] [--json]
php artisan email-validator:stats [--json]