Класс для работы с emails

Еmail (по нашим правилам) бывает:
  • невалидным
  • бесплатным (учебное заведение, бесплатные почтовые сервисы)
  • фейковым (пересылочные домены, домены-однодневки)
  • корпоративным (все остальные)

class Emails
{
    public const NOT_VALID = 'NOT_VALID';
    public const FAKE = 'FAKE';
    public const FREE = 'FREE';
    public const CORPORATE = 'CORPORATE';

    public static function isValidEmail(string $email, bool $checkDomain = true): bool
    {
        $emailIsValid = check_email($email);

        if ($emailIsValid && $checkDomain) {
            $emailIsValid = check_email($email, false, true);

            if (!$emailIsValid) {
                mail(EMAIL_FOR_LOGS, 'checkdnsrr failed', $email);
            }
        }

        return $emailIsValid;
    }

    public static function isValidDomain(string $domain): bool
    {
        return self::isValidEmail('test@' . $domain, false);
    }

    public static function isFakeEmail(string $email): bool
    {
        return self::isFakeDomain(self::getDomain($email));
    }

    public static function isFakeDomain(string $domain): bool
    {
        $domain = strtolower($domain);

        return !self::isFreeDomain($domain)
            && (
                in_array($domain, FakeDomains::DOMAINS)
              || self::isFakeDomainByPattern($domain)
            );
    }

    public static function isFakeDomainByPattern(string $domain): bool
    {
        $domain = strtolower($domain);
        foreach (FakeDomains::PATTERNS as $pattern) {
            if (preg_match($pattern, $domain)) {
                return true;
            }
        }
        return false;
    }

    public static function isFreeEmail(string $email): bool
    {
        return self::isFreeDomain(self::getDomain($email));
    }

    public static function isFreeDomain(string $domain): bool
    {
        return in_array(strtolower($domain), FreeDomains::DOMAINS);
    }

    public static function isCorporateEmail(string $email): bool
    {
        return self::isCorporateDomain(self::getDomain($email));
    }

    public static function isCorporateDomain(string $domain): bool
    {
        return !self::isFreeDomain($domain) && !self::isFakeDomain($domain);
    }

    public static function getDomain(string $email): string
    {
        $arEmail = explode('@', mb_strtolower(trim($email)));
        return $arEmail[1] ?? '';
    }

    public static function getTypeEmail(string $email): string
    {
        if(!self::isValidEmail($email)){
            return self::NOT_VALID;
        }

        return self::getTypeDomain(self::getDomain($email));
    }

    public static function getTypeDomain(string $domain): string
    {
        if(self::isFreeDomain($domain)){
            return self::FREE;
        }
        if(self::isFakeDomain($domain)){
            return self::FAKE;
        }

        return self::CORPORATE;

    }
}