3

電子メール ドメインを検証したいが、表示される可能性のあるサブドメインについて心配したくありません。

例えば:

@abc.com
@a.abc.com
@b.abc.com
...

これらはすべて有効である必要があります。

また、abc.com、xyz.com など、検証するドメインのリストがあります。サブドメインを含め、リストから電子メール ドメインを検証するにはどうすればよいですか?

ありがとう。

4

6 に答える 6

4

ホワイトリストに登録するドメインスキームの種類に制限されないように、これをよりわかりやすく書き直すことにしました。

$whitelist = array("abc.com", "xyz.com", "specific.subdomain.com", "really.specific.subdomain.com"); //You can add basically whatever you want here because it checks for one of these strings to be at the end of the $email string.
$email = "@d.xyz.com";

function validateEmailDomain($email, $domains) {
    foreach ($domains as $domain) {
        $pos = strpos($email, $domain, strlen($email) - strlen($domain));

        if ($pos === false)
            continue;

        if ($pos == 0 || $email[(int) $pos - 1] == "@" || $email[(int) $pos - 1] == ".")
            return true;
    }

    return false;
}

したがって、次のように使用します。

if (validateEmailDomain($email, $whitelist))
    //Do something.
于 2013-02-26T20:29:43.860 に答える
4

dns を使用してドメインを検証することもできます。

function validEmail($email)
{
    $allowedDomains = array('abc.com');
    list($user, $domain) = explode('@', $email);
    if (checkdnsrr($domain, 'MX') && in_array($domain, $allowedDomains))
    {
        return true;
    }
    return false;
}
于 2013-02-26T20:33:48.430 に答える
1

私はしばらく前にこの関数を書きました。それはあなたが探しているものの要件を満たすかもしれません。これは2つのことを行い、電子メールアドレスが有効なアドレスであることを検証してから、ドメイン名がDNSのMXレコードに対して有効な名前であるかどうかを検証します。

function validate_email($email) {
    // Check email syntax
    if(preg_match('/^([a-zA-Z0-9\._\+-]+)\@((\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,7}|[0-9]{1,3})(\]?))$/', $email, $matches)) {
        $user = $matches[1];
        $domain = $matches[2];

        // Check availability of DNS MX records
        if(getmxrr($domain, $mxhosts, $mxweight)) {
            for($i=0;$i<count($mxhosts);$i++){
                $mxs[$mxhosts[$i]] = $mxweight[$i];
            }

            // Sort the records
            asort($mxs);
            $mailers = array_keys($mxs);
        } elseif(checkdnsrr($domain, 'A')) {
            $mailers[0] = gethostbyname($domain);
        } else {
            $mailers = array();
        }
        $total = count($mailers);

        // Added to still catch domains with no MX records
        if($total == 0 || !$total) {
            $error = "No MX record found for the domain.";
        }
    } else {
        $error = "Address syntax not correct.";
    }

    return ($error ? $error : TRUE);
}
于 2013-02-26T20:27:41.367 に答える
1

ドメインのリストをチェックする機能を備えた正規表現の簡単な例を書きました。

    <?php

    $email = 'shagtv@a.xyz.com';

    $domains = array('abc.com', 'xyz.com');

    $pattern = "/^[a-z0-9._%+-]+@[a-z0-9.-]*(" . implode('|', $domains) . ")$/i";

    if (preg_match($pattern, $email)) {
        echo 'valid';
    } else {
        echo 'not valid';
    }
    ?>
于 2013-02-26T20:38:33.077 に答える
0

さて、あなたはこのようないくつかのコードを使うべきです:

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

またはこれ:

<?php
$email = "someone@exa mple.com";

if(!filter_var($email, FILTER_VALIDATE_EMAIL))
  {
  echo "E-mail is not valid";
  }
else
  {
      echo "E-mail is valid";
  }
?>

または、このページで少し変更する必要があります。

それが役に立てば幸い!

于 2013-02-26T20:27:12.670 に答える
0

この投稿と非常によく似ています: PHP Check domain of email being registered is a 'school.edu' address

ただし、さらに一歩進める必要があります。分割したら、parse_url http://php.net/manual/en/function.parse-url.phpを見て、HOST 部分を取得します。

于 2013-02-26T20:31:34.380 に答える