BonBonSlick
@BonBonSlick
Vanilla Web Architect

Проверка емейла на существование?

SO

Пример пакета 1
Пример 2

Но весь этот код сильно устаревший и заброшен.

Есть ли актуальные пакеты?
Или перепиливать примеры все же придется?

Делаю валидацию емейла
  • Syntax verification (IETF/RFC standard conformance)
  • DNS validation, including MX record lookup
  • Disposable email address detection
  • Misspelled domain detection to prevent Typosquatting
  • SMTP connection and availability checking
  • Temporary unavailability detection
  • Mailbox existence checking
  • Greylisting detection


Php Mana
Mana 2
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
BonBonSlick
@BonBonSlick Автор вопроса
Vanilla Web Architect
пришел к следующему
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(),
                ]
            ),
        ];
    }
}


Можно конечно подключить более продвинутые АПИ, но я сделал иначе.
Для регистрации отправка верификационного кода на емейл, если юзер не ввел код, то он не сможет зарегестрироваться.
Это решает кучу вероятных проблем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы