пришел к следующему
1 - проверка RFC symfony validation email
2 - проверка isValid EmailValidator упомянутый пакет ранее. Проверяет блеклист disposable EA и RFC
3 - использую АПИ для проверки DEA
4 - checkdnsrr домена
/**
* Docs:
* https://debounce.io/free-disposable-check-api/?
* https://www.validator.pizza/
* https://block-temporary-email.com/
* https://github.com/ivolo/disposable-email-domains
*
* @throws GuzzleException
* @throws JsonException
*/
public function isDEA(string $email): bool {
$arr = [
'https://disposable.debounce.io/?email=',
'https://www.validator.pizza/email/email/',
'https://open.kickbox.com/v1/disposable/',
'temporary' => 'https://block-temporary-email.com/check/email/',
];
$result = false;
foreach ($arr as $responseKey => $url) {
$response = $this->disposableResponse(
sprintf('%s%s', $url, $email),
true === is_string($responseKey) ? $responseKey : null
);
if (true === $response) {
$result = true;
break;
}
}
// $mx = getmxrr("php.net");
$domain = substr($email, strpos($email, '@') + 1);
return false === checkdnsrr($domain) || true === $result || false === MailChecker::isValid($email);
}
final class DisposableEmailConstraintValidator extends ConstraintValidator {
private IDisposableEmailValidationService $disposableEmailValidation;
public function __construct(IDisposableEmailValidationService $disposableEmailValidation) {
$this->disposableEmailValidation = $disposableEmailValidation;
}
/**
* @param ValueObjectBridgeConstraint $constraint
*/
public function validate($validationValue, Constraint $constraint): void {
if (true === $this->disposableEmailValidation->isDEA($validationValue)) {
$this->context->buildViolation($constraint->message)->addViolation();
}
}
}
final class EmailCompound extends Compound {
protected function getConstraints(array $options): array {
return [
new Sequentially(
[
new Type(['type' => 'string']),
new Length(['min' => 5, 'max' => 32,]),
new Email(['message' => 'email', 'mode' => 'strict']),
new DisposableEmailConstraint(),
]
),
];
}
}
Можно конечно подключить более продвинутые АПИ, но я сделал иначе.
Для регистрации отправка верификационного кода на емейл, если юзер не ввел код, то он не сможет зарегестрироваться.
Это решает кучу вероятных проблем.