web-dev-qa-db-ja.com

メールを送信せずにメールアドレスが存在するかどうかを確認するにはどうすればよいですか?

私はこれに遭遇しました メールを送信せずにSMTPを使用してメールアドレスをチェックするPHPコード

誰かが似たようなことを試しましたか、それはあなたのために機能しますか?顧客/ユーザーが入力した電子メールが正しいかどうかを確認できますか?

112
php-guy

受信者が実際に存在するかどうかを判断するために使用できる時々の2つの方法があります。

  1. サーバーに接続し、VRFYコマンドを発行できます。このコマンドをサポートするサーバーはほとんどありませんが、これはまさにこのためのものです。サーバーが2.0.0 DSNで応答する場合、ユーザーは存在しています。

    VRFYユーザー

  2. RCPTを発行して、メールが拒否されるかどうかを確認できます。

    差出人:<>

    RCPT TO:<user @ domain>

ユーザーが存在しない場合、5.1.1 DSNを取得します。ただし、メールが拒否されないからといって、ユーザーが存在するわけではありません。一部のサーバーは、ユーザーの列挙を防ぐために、このような要求を静かに破棄します。他のサーバーはユーザーを確認できず、メッセージを受け入れなければなりません。

また、グレイリストと呼ばれるスパム対策手法もあります。これにより、サーバーは最初にアドレスを拒否し、しばらくすると実際のSMTPサーバーが再配信を試行することを期待します。これは、アドレスを検証する試みを台無しにします。

正直なところ、アドレスを検証しようとしている場合、簡単な正規表現を使用して明らかに無効なアドレスをブロックしてから、システムに返信する実際のメールを送信し、メールが受信されたことを確認します。また、これにより、ユーザーが実際にメールを入力したことを保証します。たまたま他人に属しているようなわずかなミスはありません。

88
Joseph Tary

ここでの他の答えは、これをしようとすることに関するさまざまな問題を議論しています。自分で学習したい場合に、これをどのように試してみるかを示すと思いました。

Telnet経由でメールサーバーに接続して、メールアドレスが存在するかどうかを確認できます。 stackoverflow.comのメールアドレスをテストする例を次に示します。

 C:\> nslookup -q = mx stackoverflow.com 
権限のない回答:
 stackoverflow.com MX設定= 40、メールエクスチェンジャー= STACKOVERFLOW.COM.S9B2.PSMTP .com 
 stackoverflow.com MX設定= 10、メールエクスチェンジャー= STACKOVERFLOW.COM.S9A1.PSMTP.com 
 stackoverflow.com MX設定= 20、メールエクスチェンジャー= STACKOVERFLOW.COM.S9A2.PSMTP .com 
 stackoverflow.com MX設定= 30、メールエクスチェンジャー= STACKOVERFLOW.COM.S9B1.PSMTP.com 
 
 C:\> telnet STACKOVERFLOW.COM.S9A1.PSMTP。 com 25 
 220 Postini ESMTP 213 y6_35_0c4準備完了。 CA Business and Professions Code Section 17538.45では、未承諾の電子メール広告にこのシステムを使用することを禁じています。
 
 helo hi 
 250 Postiniが挨拶しますメール:<[email protected]> 
 250 Ok 
 
 rcpt to:<[email protected]> 
 550-5.1.1メールアカウントあなたが到達しようとしたことは存在しません。 
 550-5.1.1の入力ミスや
 550-5.1.1の不要なスペースがないか、受信者のメールアドレスを再確認してください。詳細については、
 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71 

数値コードのプレフィックスが付いた行は、SMTPサーバーからの応答です。読みやすくするために空白行を追加しました。

多くのメールサーバーは、スパマーによる電子メールアドレスの収集を防ぐ手段としてこの情報を返さないため、この手法に頼ることはできません。ただし、無効なメールサーバーを検出するか、上記のように受信者アドレスを拒否することにより、明らかに悪いメールアドレスを削除することに成功する場合があります。

あまりにも多くのリクエストを行うと、メールサーバーがブラックリストに載ることがあることに注意してください。


PHPでは、fsockopenfwrite、およびfreadを使用して上記の手順をプログラムで実行できると考えています。

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
45
Drew Noakes

一般的な答えは、notにメールを送信する場合、メールアドレスが存在するかどうかを確認することができるということです:それはブラックホールに入る可能性があります。

そこに記載されている方法は非常に効果的であると言われています。 ZoneCheck の実動コードで使用されますが、QUITではなくRSETを使用する点が異なります。

メールボックスとのユーザーインタラクションが過度に高くない場合、多くのサイトは実際に、送信者に送り返す必要のある秘密番号を送信することにより(秘密URLに移動するか、この秘密番号を電子メールで送信することによって)メールがどこかに到着するかをテストします。ほとんどのメーリングリストはそのように機能します。

8
kmkaplan

ターゲットメールサーバーがグレーリストを使用している場合、これは(他のケースの中でも)失敗します。

Greylisting:SMTPサーバーは、以前は未知のクライアントが最初に接続したときに配信を拒否し、次回は許可します。これにより、スパムボットの一部が排除され、正当な使用が許可されます-正当なメール送信者が再試行することが予想されるため、通常のメール転送エージェントしましょう。

ただし、コードがサーバーのみをチェックする場合once、グレーリストのあるサーバーは配信を拒否します(クライアントが初めて接続するため)。しばらくしてもう一度確認しない限り、有効な電子メールアドレスを誤って拒否している可能性があります。

6
Piskvor

実際にはそうではありません.....一部のサーバーは「rcpt to:」をチェックしない場合があります

http://www.freesoft.org/CIE/RFC/1123/92.htm

そうすることはセキュリティリスクです.....

サーバーがそうする場合、サーバー上のすべてのアドレスを発見するボットを書くことができます。

6
l_39217_l

いくつかの問題:

  1. 一部のSMTPサーバーは、指定したアドレスが存在しない場合はすぐに通知されると確信していますが、一部のプライバシー保護手段はそうではありません。彼らはあなたが与えたどんなアドレスでも受け入れて、存在しないものを静かに無視します。
  2. 記事にあるように、一部のサーバーでこれを頻繁に行うと、ブラックリストに載ってしまいます。
  3. 一部のSMTPサーバー(Gmailなど)では、何かを行うためにSSLを使用する必要があります。 これは、GmailのSMTPサーバーを使用して送信メールを送信する場合にのみ当てはまります。
4
Graeme Perrow
function EmailValidation($email)
{
    $email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
    if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
        //checks to make sure the email address is in a valid format
        $domain = explode( "@", $email ); //get the domain name
        if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
            //if the connection can be established, the email address is probably valid
            echo "Domain Name is valid ";
            return true;
        } else {
            echo "Con not a email domian";
            return false; //if a connection cannot be established return false
        }
        return false; //if email address is an invalid format return false
    }
}
3
Sachin

「顧客/ユーザーが入力した電子メールが正しいかどうかを確認できますか?」

実際、これらは2つの別個のものです。 existかもしれませんが、正しくないかもしれません。

場合によっては、額面価格でユーザー入力を取得する必要があります。それ以外の場合、システムを無効にする方法は多数あります。

2
Learning

この質問は少し古いですが、このサービスのヒントは、送信前に構文検証を超えて電子メールアドレスをチェックする同様のソリューションを検索するユーザーに役立つ場合があります。

私はこれを使用してきました オープンソースサービス より良い結果を得るためにいくつかのプロジェクトのメールの詳細な検証(メールアドレスドメインのmxレコードの確認など)を行いました。また、よくあるタイプミスをチェックします。デモ ここ

2
Henkealg

できることは、DNSを検索して、電子メールアドレスにあるドメインにMXレコードがあることを確認することだけです。ただし、これに対処する信頼できる方法はありません。

一部のサーバーは、SMTPサーバーと通信するrcpt-toメソッドを使用できますが、サーバーの構成に完全に依存します。別の問題は、サーバーが過負荷で、ユーザーが不明であることを示す550コードを返す可能性がありますが、これは一時的なエラーであり、返される永続的なエラー(451と思いますか?)があります。これは全体サーバーの構成に依存します。

私は個人的にDNS MXレコードをチェックし、MXレコードが存在する場合は電子メールの確認を送信します。

2
Bryan Rehbein

と仮定すると ユーザーの 一部のメールサーバーでは、SMTP VRFYコマンドがメールボックスに対して実際にメールアドレスを確認することを許可しています。主要なサイトのほとんどは、多くの情報を提供しません。 Gmailの応答は、「メールを送信しようとした場合、配信を試みます」またはそのような巧妙なものです。

1
Austin Salonen

できないと思います。電子メールの送信でさえ失敗する可能性のあるシナリオは非常に多くあります。例えば。ユーザー側のメールサーバーが一時的にダウンしている、メールボックスは存在するが、メッセージが配信できないなどの理由でいっぱいになっている.

ユーザーが確認メールを受信したことを確認した後に、非常に多くのサイトが登録を検証するのはおそらくこれが理由です。

1
PhiLho