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


123

電子メールを送信せずにSMTPを使用して電子メールアドレスをチェックするこのPHPコードに出くわしました。

誰かが似たようなことを試しましたか、それともあなたのためにうまくいきますか?顧客/ユーザーが入力したメールが正しいか、存在するかどうかわかりますか?



2
疑問に思って、なぜこれにTelnetタグがあるのですか?
Piccolo

2
まさにそれを行うPHPライブラリがあります:github.com/kickboxio/kickbox-php
Dan

Kickboxは無料ではありません。このAPIは、サービスに接続するための単なるラッパーです。
Ashit Vora 2016年

回答:


92

あなたができる2つの方法があり、時々受信者が実際に存在するかどうかを決定するために使用するには:

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

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

    MAIL FROM:<>
    RCPT TO:<user@domain>
    

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

グレイリストと呼ばれるスパム対策テクニックもあります。これは、サーバーが最初にアドレスを拒否するようにし、実際のSMTPサーバーがしばらくしてから再配信を試みることを期待します。これにより、アドレスの検証が失敗します。

正直なところ、アドレスを検証しようとしている場合、最善のアプローチは、単純な正規表現を使用して明らかに無効なアドレスをブロックし、システムへのリンクを含む実際のメールを送信して、メールが受信されたことを検証することです。これにより、ユーザーが実際のメールアドレスを入力したことを確認できます。たまたま誰かに属しているわずかなタイプミスではありません。


10
一部のサーバーはメッセージを受け入れますが、後で独自のメールサーバーを持つ多くの内部部門を持つ大規模な組織の場合は、後でエラーメッセージをエンベロープ送信者に送り返します。境界サーバーは、すべてのアカウントを把握しているわけではありません。
DavidMårtensson、2011

3
それでは、なぜスパマーがこの方法を使用して電子メールのアディを検証しないのですか?これらの方法がサポートされているサーバーが非常に少ないという事実はさておき、それともそうですか?
Shahriyar Imanov

7
@Shehi:実際、スパマーこの方法を使用する可能性がありますが、それわかりにくいです。ただし、スパマー使用する可能性があるため、ほとんどすべてのメールサーバーがVRFYを無効にするため、実際にはVRFYはおそらく役に立たないでしょう。
sleske 2012

2
RCPT TO:<user @ domain>の使用方法のコード例を教えてください。ありがとう
Papa De Beau

4
VRFYに、Gmailは「メールを送信して、最善を尽くします」と応答します;-)
Armel Larcier

46

ここでの他の回答は、これを実行しようとする際のさまざまな問題について説明しています。自分で習得したい場合にどうしたらいいのか、教えてあげたいと思いました。

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では、このシステムを迷惑な電子メール広告に使用することを禁じています。

こんにちは
250 Postiniはこんにちはと言います

からのメール:<me@myhost.com>
250 OK

rcpt to:<fake@stackoverflow.com>
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 fsockopenではfwritefreadを使用して、上記の手順をプログラムで実行できると思います。

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");

脱帽!私が見つけた1つの問題は、ポート25は常に優先度の低いmxレコードで動作するのですか?
Dhruvenkumar Shah

@DhruvenkumarShah、ごめんなさい。気付いたらまたコメントしてください。
Drew Noakes

こんにちは、私は自分の大学のアカウントでMXレコードのすべてを調べようとしていましたが、25では機能しませんでしたが、オンラインのverify-email.orgのようなWebサイトは機能しました。見つけたらお知らせします
Dhruvenkumar Shah

1
@DhruvenkumarShahメール交換サーバー名をほとんど提供しません。メールエクスチェンジャーの回答をご覧ください。そのため、1つが失敗した場合、リストの他のものが機能するはずです。
Janaka R Rajapaksha

実際に非常に感謝.. sir..iはパテや魅力などの作品でそれを試してみましたありがとう... MEEへの完全な助け
モハメドSufian

8

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

そこに記載されている方法は非常に効果的であると言われています。QUITの代わりにRSETを使用することを除いて、ZoneCheckの製品コードで使用されます。

ユーザーがメールボックスを操作してもコストがかからない場合、多くのサイトは実際に、エミッタに送り返さなければならないシークレット番号を送信することによってメールがどこかに到着することをテストします(シークレットURLに行くか、このシークレット番号を電子メールで送り返す)。ほとんどのメーリングリストはそのように機能します。



6

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

グレイリスト:SMTPサーバーは、以前は不明だったクライアントが初めて接続したときに配信を拒否し、次回は許可します。これにより、正当な使用を許可しながら、スパムボットの一部を遮断します- 正当なメール送信者が再試行することが予想されるため、これは通常のメール転送エージェントが行うことです。

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


(個人的な経験:はい、私は自分が何をしているのかを知っています、そしてはい、私はグレーリストをオフにする必要があるとサードパーティのサービスからのこれらのチェックが失敗したため)
Piskvorは、

4

いくつかの問題:

  1. SMTPサーバーによっては、指定したアドレスが存在しない場合にすぐに通知するものもありますが、プライバシー対策として機能しないものもあります。彼らはあなたが彼らに与えたどんなアドレスでも受け入れて、静かに存在しないものを無視します。
  2. 記事にあるように、一部のサーバーでこれを頻繁に実行すると、ブラックリストに登録されます。
  3. 一部のSMTPサーバー(Gmailなど)では、何かを行うためにSSLを使用する必要があります。 これは、GmailのSMTPサーバーを使用しメールを送信する場合にのみ当てはまります。

3番目の点に関しては、これをリレーとして使用する場合にのみ発生します。SSLを必要とするメールエクスチェンジャーについては知りません。これが行われた場合、多くのユーザーからのメールの受信が停止します。
kmkaplan 2009

すみません、私の間違いです。GmailのSMTPサーバーを使用しメールを送信する場合は、SSLを使用する必要があります。
Graeme Perrow、

3

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

私はこのオープンソースサービスを使用して、いくつかのプロジェクトで電子メールのより詳細な検証(電子メールアドレスドメインのmxレコードの確認など)を行っています。また、一般的なタイプミスの魔女のチェックも非常に役立ちます。デモはこちら


このサービスはオープンソースであると主張しています。ソースへのリンクを提供してもらえますか?
amaurymartiny

申し訳ありませんが、@ amaurymartinyはできません。この記事を書いている時点では、正しく思い出せば、Mailgunプロジェクトはオープンソースでしたが、これ以降、ソースを提供するリポジトリへのリンクが見つかりません。
Henkealg

2

「顧客/ユーザーが入力した電子メールが正しいかどうか、存在するかどうかわかりますか?」

実際、これらは2つの別個のものです。それは可能性が存在しますが正しくない可能性があります。

時々あなたは額面でユーザー入力を取る必要があります。それ以外の場合、システムを無効にする方法はたくさんあります。


2
+1 電子メールを送信し、実際にリンクをクリックするなどの人間の応答を得ない限り、それが正しいことを確認することはできません。
ダニエルダラナス2009年

メール本文にリンク(画像など)を保持し、そのリンクの各負荷をカウントできます。クリックを待つ必要はありません
Janaka R Rajapaksha 2014年

2

できることは、DNSを検索し、メールアドレス内のドメインにMXレコードがあることを確認することだけです。これを処理する信頼できる方法がないことを除けば、

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

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


2
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
    }
}

1
ポート80は意味をなさない
jrosell

5
メールそのものをチェックするのではなく、ドメイン名が存在することをチェックするだけだと思います。
Angry Saxon

これはもっと便利かもしれません:getmxrr
jchook

1

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


1

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

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


0

ジョセフとドリューの答えを確認できますRCTP TO: <address_to_check>。私はそれらの答えの上にいくつかの小さな補遺を追加したいと思います。

キャッチオールプロバイダー

一部のメールプロバイダーは、キャッチオールポリシーを実装しています。*@mydomain.comつまり、RCTP TO:コマンドに対して肯定的な応答を返します。しかし、これは必ずしも「人間に属する」のようにメールボックスが「存在する」ことを意味するわけではありません。ここでは何もできないので、注意してください。

IPグレイリスト/ブラックリスト

グレイリスト:不明なIPからの最初の接続がブロックされます。解決策:少なくとも2回再試行します。

ブラックリスト:同じIPから送信するリクエストが多すぎる場合、このIPはブロックされます。解決策:IPローテーションを使用します。リーチャーはTorを使用します。

サインアップフォームのHTTPリクエスト

これは非常にプロバイダー固有ですが、巧妙に作成されたHTTP要求を使用し、これらの要求の応答を解析して、ユーザー名がこのプロバイダーにすでにサインアップしているかどうかを確認できます。

以下は、*@yahoo.comHTTPリクエストを使用してアドレスをチェックするために私が作成したオープンソースライブラリの関連関数です:check-if-email-exists。私のコードはRustであり、このスレッドにはPHPのタグが付けられていますが、同じ考え方が適用されます。

完全な受信トレイ

これはエッジケースになる可能性がありますが、ユーザーが受信トレイをいっぱいにRCTP TO:すると、いっぱいであることを示す5.1.1 DSNエラーメッセージが返されます。これは、アカウントが実際に存在することを意味します。

開示

リアルタイムのメール検証APIであるReacherを実行しています。私のコードはRustで書かれており、100%オープンソースです。より堅牢なソリューションが必要かどうかを確認してください。

Github:https : //github.com/amaurymartiny/check-if-email-exists

さまざまな手法を組み合わせてフープをジャンプすることで、顧客がチェックするメールの約80%を確認することができました。


-8
<?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";

?>

ユーザーはphpではなく.Netソリューションを求めています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.