web-dev-qa-db-ja.com

メールの検証

約5万件の連絡先があるCRMを使用していますが、情報の送信先について真剣に考えたいと思います。これの多くの手順の1つは、電子メールアドレスの検証です。

サーバーにpingを実行するスクリプトを書くだけで十分でしょうか?リストから真のハードバウンスを取り除くことを探しています。ドメインのようなものはもはや有効ではないか、明らかに完全なゴミ([email protected])であるメールアドレス<-実際の例。

1
dasickle

最初のステップは、コマンドを使用してドメインのチェックを行い、メールエクスチェンジャーを特定することです...

nslookup -q=mx domain.com

次のような応答を受け取るはずです...

Non-authoratative answer:
domain.com mail exchanger = 0 mx1.domain.com
domain.com mail exchanger = 0 mx2.domain.com

注意:返されるレコードの数は、ドメインゾーンファイル内のMXレコードの数になります。

メール交換機のアドレスがわかったので、次のステップはメール交換機に接続することです...

telnet mx1.domain.com 25

次のような応答を受け取るはずです

Connected to mx1.domain.com 25
Escape character is '^]'.
220 mx1.domain.com ESMTP

コマンド

helo hi

応答

250 mx1.domain.com

コマンド

mail from <[email protected]>

応答

250 2.1.0 Ok

コマンド

rcpt to: <[email protected]>

これで、次の応答は、サーバー上に電子メールアドレスが存在するかどうかを示します...

550 5.1.1 <[email protected]>: Recipient address rejected: Unknown user in virtual alias table

コマンド

quit

応答

221 2.0.0 Bye

基本的に、このコマンドと応答のシーケンスが行ったことは、SMTPサーバーが実行するのと同じコマンドと応答のシーケンスをエミュレートして、最初の段階だけにメールを送信することです。このチェックを行うと、電子メールアドレスが存在するかどうかを確認する応答が得られます。存在する場合、それは有効なメールアドレスですが(ただし、期待するユーザーに属しているという意味ではありません)、rcpt toチェックを行うときに550エラー応答を受け取った場合、そのメールアドレスは現在、メールサーバーには存在しません。すべてのメールエクスチェンジャーが同じデータを返し、同じドメイン名の共通アドレスエイリアステーブルを処理する必要があるため、このコマンドシーケンスでメールエクスチェンジャーの1つをチェックするだけです。

これはスクリプト化できますが、ProWebmasters SEの範囲を少し超えており、使用する必要のある任意の言語で実行できます。基本的にブール値を返す関数ですべてをラップすることで、チェックを実行できます。チェック(ドメインなし、MXレコードなし、SMTP 550エラー)がある場合はfalseを返すことができ、チェックは失敗したと見なされます。メールアドレスは無効であり、その時点ではメールを受信しません。

2