/**
* Check if the email is valid.
*
* @param string $email
* @param bool $useExampleDomainCheck
* @param bool $useTypoInDomainCheck
* @param bool $useTemporaryDomainCheck
* @param bool $useDnsCheck (do not use, if you don't need it)
*
* @return bool
*/
public static function isValid($email, $useExampleDomainCheck = false, $useTypoInDomainCheck = false, $useTemporaryDomainCheck = false, $useDnsCheck = false)
{
// must be a string
if (!is_string($email)) {
return false;
}
// make sure string length is limited to avoid DOS attacks
$emailStringLength = strlen($email);
if ($emailStringLength >= 320 || $emailStringLength <= 2) {
return false;
}
unset($emailStringLength);
$email = str_replace(array('.', '@'), array('.', '@'), $email);
if (strpos($email, '@') === false || strpos($email, '.') === false && strpos($email, ':') === false) {
return false;
}
if (!preg_match('/^(?<local>.*<?)(?:.*)@(?<domain>.*)(?:>?)$/', $email, $parts)) {
return false;
} else {
$local = $parts['local'];
$domain = $parts['domain'];
// Escaped spaces are allowed in the "local"-part.
$local = str_replace('\\ ', '', $local);
// Spaces in quotes e.g. "firstname lastname"@foo.bar are also allowed in the "local"-part.
$quoteHelperForIdn = false;
if (preg_match('/^"(?<inner>[^"]*)"$/mU', $local, $parts)) {
$quoteHelperForIdn = true;
$local = trim(str_replace($parts['inner'], str_replace(' ', '', $parts['inner']), $local), '"');
}
if (strpos($local, ' ') !== false || strpos($local, '".') !== false) {
return false;
}
if (function_exists('idn_to_ascii') && UTF8::max_chr_width($email) <= 3) {
$localTmp = idn_to_ascii($local);
if ($localTmp) {
$local = $localTmp;
}
unset($localTmp);
$domainTmp = idn_to_ascii($domain);
if ($domainTmp) {
$domain = $domainTmp;
}
unset($domainTmp);
} else {
static $punycode = null;
if ($punycode === null) {
$punycode = new Punycode();
}
$local = $punycode->encode($local);
$domain = $punycode->encode($domain);
}
if ($quoteHelperForIdn === true) {
$local = '"' . $local . '"';
}
$email = $local . '@' . $domain;
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
} else {
$valid = true;
}
if ($useExampleDomainCheck === true && self::isExampleDomain($domain) === true) {
return false;
}
if ($useTypoInDomainCheck === true && self::isTypoInDomain($domain) === true) {
return false;
}
if ($useTemporaryDomainCheck === true && self::isTemporaryDomain($domain) === true) {
return false;
}
if ($useDnsCheck === true && self::isDnsError($domain) === true) {
return false;
}
}
return $valid;
}