電子メールを送信せずにSMTPを使用して電子メールアドレスをチェックするこのPHPコードに出くわしました。
誰かが似たようなことを試しましたか、それともあなたのためにうまくいきますか?顧客/ユーザーが入力したメールが正しいか、存在するかどうかわかりますか?
電子メールを送信せずにSMTPを使用して電子メールアドレスをチェックするこのPHPコードに出くわしました。
誰かが似たようなことを試しましたか、それともあなたのためにうまくいきますか?顧客/ユーザーが入力したメールが正しいか、存在するかどうかわかりますか?
回答:
あなたができる2つの方法があり、時々受信者が実際に存在するかどうかを決定するために使用するには:
サーバーに接続し、VRFY
コマンドを発行できます。このコマンドをサポートしているサーバーはほとんどありませんが、これはまさにこれを目的としています。サーバーが2.0.0 DSNで応答する場合、ユーザーは存在します。
VRFY user
を発行してRCPT
、メールが拒否されたかどうかを確認できます。
MAIL FROM:<>
RCPT TO:<user@domain>
ユーザーが存在しない場合は、5.1.1 DSNを取得します。ただし、メールが拒否されなかったからといって、ユーザーが存在するという意味ではありません。一部のサーバーは、ユーザーの列挙を防ぐために、このような要求を暗黙的に破棄します。他のサーバーはユーザーを確認できず、メッセージを受け入れる必要があります。
グレイリストと呼ばれるスパム対策テクニックもあります。これは、サーバーが最初にアドレスを拒否するようにし、実際のSMTPサーバーがしばらくしてから再配信を試みることを期待します。これにより、アドレスの検証が失敗します。
正直なところ、アドレスを検証しようとしている場合、最善のアプローチは、単純な正規表現を使用して明らかに無効なアドレスをブロックし、システムへのリンクを含む実際のメールを送信して、メールが受信されたことを検証することです。これにより、ユーザーが実際のメールアドレスを入力したことを確認できます。たまたま誰かに属しているわずかなタイプミスではありません。
ここでの他の回答は、これを実行しようとする際のさまざまな問題について説明しています。自分で習得したい場合にどうしたらいいのか、教えてあげたいと思いました。
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
ではfwrite
、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: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
一般的な答えは、メールアドレスにメールを送信した場合、そのメールアドレスが存在するかどうかを確認することはできないということです。それはブラックホールに入る可能性があるだけです。
そこに記載されている方法は非常に効果的であると言われています。QUITの代わりにRSETを使用することを除いて、ZoneCheckの製品コードで使用されます。
ユーザーがメールボックスを操作してもコストがかからない場合、多くのサイトは実際に、エミッタに送り返さなければならないシークレット番号を送信することによってメールがどこかに到着することをテストします(シークレットURLに行くか、このシークレット番号を電子メールで送り返す)。ほとんどのメーリングリストはそのように機能します。
本当に.....一部のサーバーは「rcpt to:」をチェックしない場合があります
http://www.freesoft.org/CIE/RFC/1123/92.htm
そうすることはセキュリティリスクです...
サーバーの場合は、サーバー上のすべてのアドレスを検出するボットを作成できます。
ターゲットのメールサーバーがグレイリストを使用している場合、これは(他のケースの中で)失敗します。
グレイリスト:SMTPサーバーは、以前は不明だったクライアントが初めて接続したときに配信を拒否し、次回は許可します。これにより、正当な使用を許可しながら、スパムボットの一部を遮断します- 正当なメール送信者が再試行することが予想されるため、これは通常のメール転送エージェントが行うことです。
ただし、コードがサーバーを1度だけチェックする場合、グレイリストを備えたサーバーは配信を拒否します(クライアントが初めて接続するため)。しばらくしてからもう一度確認しないと、有効な電子メールアドレスが誤って拒否されている可能性があります。
いくつかの問題:
この質問は少し古いですが、このサービスヒントは、送信前に構文検証を超えて電子メールアドレスをチェックする同様のソリューションを検索するユーザーに役立つ場合があります。
私はこのオープンソースサービスを使用して、いくつかのプロジェクトで電子メールのより詳細な検証(電子メールアドレスドメインのmxレコードの確認など)を行っています。また、一般的なタイプミスの魔女のチェックも非常に役立ちます。デモはこちら。
「顧客/ユーザーが入力した電子メールが正しいかどうか、存在するかどうかわかりますか?」
実際、これらは2つの別個のものです。それは可能性が存在しますが正しくない可能性があります。
時々あなたは額面でユーザー入力を取る必要があります。それ以外の場合、システムを無効にする方法はたくさんあります。
できることは、DNSを検索し、メールアドレス内のドメインにMXレコードがあることを確認することだけです。これを処理する信頼できる方法がないことを除けば、
一部のサーバーは、SMTPサーバーと通信するrcpt-toメソッドで動作しますが、サーバーの構成に完全に依存します。別の問題は、過負荷のサーバーがユーザーが不明であることを示す550コードを返すことがありますが、これは一時的なエラーであり、永続的なエラー(451と思いますか?)が返される可能性があります。これは、サーバーの構成に完全に依存します。
私は個人的にDNS MXレコードを確認し、MXレコードが存在する場合は確認メールを送信します。
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
}
}
ユーザーのアドレスであると仮定すると、一部のメールサーバーでは、SMTP VRFYコマンドでメールボックスに対して電子メールアドレスを実際に確認できます。主要なサイトのほとんどは、多くの情報を提供しません。Gmailの応答は、「メールを送信しようとすると、配信を試みます」またはそのような賢いものです。
ジョセフとドリューの答えを確認できますRCTP TO: <address_to_check>
。私はそれらの答えの上にいくつかの小さな補遺を追加したいと思います。
一部のメールプロバイダーは、キャッチオールポリシーを実装しています。*@mydomain.com
つまり、RCTP TO:
コマンドに対して肯定的な応答を返します。しかし、これは必ずしも「人間に属する」のようにメールボックスが「存在する」ことを意味するわけではありません。ここでは何もできないので、注意してください。
グレイリスト:不明なIPからの最初の接続がブロックされます。解決策:少なくとも2回再試行します。
ブラックリスト:同じIPから送信するリクエストが多すぎる場合、このIPはブロックされます。解決策:IPローテーションを使用します。リーチャーはTorを使用します。
これは非常にプロバイダー固有ですが、巧妙に作成されたHTTP要求を使用し、これらの要求の応答を解析して、ユーザー名がこのプロバイダーにすでにサインアップしているかどうかを確認できます。
以下は、*@yahoo.com
HTTPリクエストを使用してアドレスをチェックするために私が作成したオープンソースライブラリの関連関数です: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%を確認することができました。
<?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";
?>