web-dev-qa-db-ja.com

PHPを使用して、メールアドレスが本物か有効かを確認する方法

このウェブサイトと同様にメールが存在するかどうかを確認することはできますか?

http://verify-email.org/

<?php
    if($_POST['email'] != ''){
        // The email to validate
        $email = $_POST['email'];

        // An optional sender
        function domain_exists($email, $record = 'MX'){
            list($user, $domain) = explode('@', $email);
            return checkdnsrr($domain, $record);
        }
        if(domain_exists($email)) {
            echo('This MX records exists; I will accept this email as valid.');
        }
        else {
            echo('No MX record exists;  Invalid email.');
        }
    }
?>
<form method="POST">
    <input type="text" name="email">
    <input type="submit" value="submit">
</form>

これは私が今持っているものです。 ドメインが存在するかどうかを確認しますが、そのドメインにユーザーのメールが存在するかどうかは確認できません。 PHPを使用してそれを行うことは可能ですか?

46
telexper

SMTPで確認する必要があります。

つまり、そのメールのSMTPサーバーに接続する必要があります。

SMTPサーバーに接続したら、次のコマンドを送信する必要があります。

HELO somehostname.com
MAIL FROM: <[email protected]>
RCPT TO: <[email protected]>

「<[email protected]>リレーアクセスが拒否されました」というメッセージが表示された場合、このメールは無効です。

単純なPHPクラスがあります。あなたはそれを使うことができます:

http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html

39
Mohsen Alizadeh

そのアカウントにメールを送信しないと、メールが実際に存在するかどうかを確認できません。ただし、少なくとも1つのようにフォーマットされていることを確認できます。

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //Email is valid
}

必要に応じて、別のチェックを追加できます。ドメインを解析してから checkdnsrr を実行します

if(checkdnsrr($domain)) {
     // Domain at least has an MX record, necessary to receive email
}

人々はこれを否定し続けているので、メールを検証するためにあなたが拘束され決定されているかどうかを考慮すべきいくつかの注意事項があります:

  1. スパマーは接続トリックも行うため、すべてのサーバーが同じように応答すると想定しないでください。他の回答の1つは this library へのリンクで、この警告があります

    一部のメールサーバーはテストメッセージをサイレントに拒否し、スパマーがユーザーのメールをチェックして有効なメールをフィルタリングできないようにするため、この機能はすべてのメールサーバーで適切に動作しない可能性があります。

    そのため、無効な住所がある場合、無効な住所の応答が返されない可能性があります。一番上の賛成の答えはこれについて言及していません。

  2. スパムリスト。はい、あなたはこれをしようとしてブラックリストに載ることができます(スパマーはこれらのトリックも知っていると言ったことを思い出してください)。それらはIPアドレスによってブラックリストに登録され、サーバーが絶えず検証接続を行っている場合、Spamhausまたは別のブロックリストに巻き込まれるリスクがあります。ブラックリストに登録された場合、電子メールアドレスを検証するのはどのような利点がありますか?

  3. メールアドレスを確認することが本当に重要な場合、受け入れられる方法は、ユーザーにメールへの返信を強制することです。確認のためにクリックする必要があるリンクを記載した完全なメールを送信します。スパムではありませんが、有効かどうかを確認することができます。

35
Machavity

私は午前中ずっとこの同じ答えを探していましたが、確認する必要があるときに、確認する必要があるすべてのメールアドレスが実際に存在するかどうかを確認することはおそらく不可能であることをほとんど発見しました。回避策として、単純なPHPスクリプトを作成して、電子メールアドレスの形式が正しいことを確認し、使用するドメイン名も正しいことを確認します。

GitHubここ https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master

<?php

# What to do if the class is being called directly and not being included in a script     via PHP
# This allows the class/script to be called via other methods like JavaScript

if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])){
$return_array = array();

if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify'])){
    $return_array['error']              = 1;
    $return_array['message']            = 'No email address was submitted for verification';
    $return_array['domain_verified']    = 0;
    $return_array['format_verified']    = 0;
}else{
    $verify = new EmailVerify();

    if($verify->verify_formatting($_GET['address_to_verify'])){
        $return_array['format_verified']    = 1;

        if($verify->verify_domain($_GET['address_to_verify'])){
            $return_array['error']              = 0;
            $return_array['domain_verified']    = 1;
            $return_array['message']            = 'Formatting and domain have been verified';
        }else{
            $return_array['error']              = 1;
            $return_array['domain_verified']    = 0;
            $return_array['message']            = 'Formatting was verified, but verification of the domain has failed';
        }
    }else{
        $return_array['error']              = 1;
        $return_array['domain_verified']    = 0;
        $return_array['format_verified']    = 0;
        $return_array['message']            = 'Email was not formatted correctly';
    }
}

echo json_encode($return_array);

exit();
}

class EmailVerify {
public function __construct(){

}

public function verify_domain($address_to_verify){
    // an optional sender  
    $record = 'MX';
    list($user, $domain) = explode('@', $address_to_verify);
    return checkdnsrr($domain, $record);
}

public function verify_formatting($address_to_verify){
    if(strstr($address_to_verify, "@") == FALSE){
        return false;
    }else{
        list($user, $domain) = explode('@', $address_to_verify);

        if(strstr($domain, '.') == FALSE){
            return false;
        }else{
            return true;
        }
    }
    }
}
?>