Pythonでメールアドレスを認証する方法
ここでは、メールアドレスを認証して貴社のPythonアプリケーションのユーザー登録手順を改善する最も簡単な方法を説明します。
メールアドレスの認証は非常に重要です。以下を含むさまざまな理由により、貴社のサイトにサインアップするユーザーのメールアドレスが有効であることを確認する必要があります:
- ユーザーがメールアドレスの入力時にタイプミスした場合にそれを検出し、登録を許可する前にユーザーに修正を促すことができます。
- クレジットカードの有効期限が切れた時、領収書を送る時、新機能の追加を連絡する時などに、ユーザーと常に連絡を取ることができます。
- 万が一ユーザーがパスワードを忘れてしまった場合でも、安全にパスワードをリセットすることができます。メールアドレスがない場合、手作業による人による確認以外にその人の身元を確認する方法はありません。
- 貴社サイトにおいてMailinatorのような使い捨てメールアドレスを使ったユーザーのサインアップを防ぎます。そのようなユーザーは、通常、フリーミアム機能を悪用するためなど、特別な理由で本当のメールアドレスを教えたがりません。本物の個人または企業のメールアドレスを持つユーザーのみに登録を許可することで、ウェブサイト悪用のリスクを減らすことができます。
しかし、メール認証が複雑になるのは、貴社のウェブサイトのメールアドレスをどのように検証するかを決めるときです。ウェブサイトごとに要件は異なりますし、ウェブサイトの内容によっては、1つか2つの特定の方法でしかユーザーのメールアドレスを認証したくないという場合もあります。
この問題を解決するために、WhoisXML APIは最近、PyPiパッケージリポジトリでemail-verifierパッケージをリリースしました。
このPythonライブラリを使うと、後述の通り、様々な方法で容易かつ柔軟にメールアドレスを認証できます。
では、さっそくその仕組みを見てみましょう!
Email Verificationアカウントの作成
email-verifierライブラリを使ってメールアドレスを検証するには、まずこちらでEmail Verification APIサービスの無料アカウントを作成する必要があります:https://emailverification.whoisxmlapi.com/signup
無料アカウントを作成すると、APIサービスを使って1,000件のメールアドレスを無料で認証できるようになります。それ以上の件数をご希望の場合は、小額の料金をお支払いいただくことも可能です。
パッケージをインストールする
アカウントのセットアップが完了したら、次はPythonパッケージをインストールします。コマンドラインから以下のコマンドを実行します:
$ pip install email-verifier
これにより、PyPiから最新リリースのemail-verifierパッケージがダウンロードおよびインストールされます。
メールアドレスの認証
アカウントとパッケージの両方がインストールされたところで、メールアドレスをすぐに認証するために実行できるコードを見てみましょう。
以下は、利用可能な全てのメソッドを使用してメールアドレスを認証する 'verify.py'
というスクリプトです。
from emailverifier import Client
from emailverifier import exceptions
client = Client('Your-api-key')
try:
data = client.get("[email protected]")
# If you get here, it means service returned HTTP error code
except exceptions.HttpException:
pass
# If you get here, it means you cannot connect to the service
except exceptions.GeneralException:
pass
# If you get here, it means you forgot to specify the API key
except exceptions.UndefinedVariableException:
pass
# If you get here, it means you specified invalid argument
# (options should be a dictionary)
except exceptions.InvalidArgumentException:
pass
except:
pass
# Something else happened related.Maybe you hit CTRL - C
# while the program was running, the kernel is killing your process, or
# something else all together.
print(data)
# Use data.json_string to get raw data in JSON.
# You can access any response field as a class property
# by converting field name from "camelCase" to "snake_case"
print("Email address: " + data.email_address)
print("Format: " + str(data.format_check))
print("DNS: " + str(data.dns_check))
print("SMTP: " + str(data.smtp_check))
print("Catch all: " + str(data.catch_all_check))
print("Disposable: " + str(data.disposable_check))
print("Free: " + str(data.free_check))
print("Last audit date: " + str(data.audit.audit_updated_date))
以下の3つの手順でライブラリを使えるようになります。
- まず
'Client'
クラスとパッケージの例外をインポートする。 - APIサービスを申し込んだ時に作成したAPIキーを使い、
‘Client'
オブジェクトに、APIサービスにサインアップしたときに作成したAPIキーを渡す。 - 認証したいメールアドレス、オプションとその値を含む辞書を渡して
'get'
メソッドを実行します。利用可能なオプションのリストは次の通りです:validateDNS
,validateSMTP
,checkCatchAll
,checkFree
,checkDisposable
,_hardRefresh
。これらのオプションの説明は当社の ドキュメントページにあります。.
この例で表示されるデータは以下のようになります:
{
"emailAddress": "[email protected]",
"formatCheck": "true",
"smtpCheck": "true",
"dnsCheck": "true",
"freeCheck": "false",
"disposableCheck": "false",
"catchAllCheck": "true",
"mxRecords": [
"ALT1.ASPMX.L.GOOGLE.com",
"ALT2.ASPMX.L.GOOGLE.com",
"ASPMX.L.GOOGLE.com",
"ASPMX2.GOOGLEMAIL.com",
"ASPMX3.GOOGLEMAIL.com"
],
"audit": {
"auditCreatedDate": "2018-04-19 18:12:45.000 UTC",
"auditUpdatedDate": "2018-04-19 18:12:45.000 UTC"
}
}
Email address: [email protected]
Format: True
DNS: True
SMTP: True
Catch all: True
Disposable: False
Free: False
Last audit date: 2018-04-19 18:12:45
返されるオブジェクトの値は、それぞれ異なるタイプの認証に対応します:
- '
catchAllCheck
'は、このメールアドレスが「キャッチオール」アドレスかどうかをチェックします。 キャッチオールアドレスとは、存在しないメールアドレスに送られたメールメッセージを受信できる特別なメールアドレスのことです。[email protected]にメールを送り、別のメールを [email protected] にメールを送ったときに両方のメールが同じ受信トレイに送られます。 - '
disposableCheck
'は、メールアドレスが(Mailinatorのようなサービスで作成された)使い捨てアドレスかどうかを確認します。これは不正利用のチェックに役立ちます。使い捨てメールアドレスでない場合、この値は'false
'になります。使い捨てである場合は'true
'になります。 - '
dnsCheck
'は、メールアドレスのドメイン名(例:gmail.com)が有効かどうかをチェックします。 有効な場合、この値は'OK
になります。 - '
freeCheck
'オプションは、メールアドレスがGmailのようなフリーメールプロバイダーのものかどうかをチェックします。 フリーメールのアドレスでない場合、この値は'false'
になります。そのドメイン名が有効な場合は'true
'になります。 - '
formatCheck
'は、メールアドレスにシンタックスエラーがないかを確認します。単純なタイプミスや大きなエラー見つける基本的なチェックです。エラーがなければ、この値は'false
'になります。エラーがあれば'true
'になります。
舞台裏では、APIサービスがこれらの認証を全て処理しています。これについては、今後の記事で取り上げます。
Email Verificationのカスタマイズ
上では利用可能な全てのメールアドレス認証方法を示しました。しかし、これらの方法をそのまま使うのではなく、カスタマイズをお考えになるかもしれません。
メール認証には時間がかかる場合があります。各検証にかかる時間は短い(コンマ数秒)ですが、全てのチェックを実行すると、その時間が積み重なります。
例えば、貴社のサイトでメールを受信できるか確認するためだけに認証を行う場合には、email-verifierパッケージの設定でそのチェックだけを実行させることが可能です。email-verifierライブラリは非常に柔軟で、あらゆるチェックを必要に応じて有効にも無効にもできます。
その仕組みは以下の通りです:
client.get("[email protected]", {
'validateSMTP': 0,
'_hardRefresh': 1,
#. . . .
})
' 'get'
メソッドでは、(上記で示した)オプションを含む辞書を使用できます。オプションによって実行するチェックが変わってきます。必要に応じて自由にご利用ください。
ユーザー登録フローの改善
以上、email-verifierライブラリを使用してメールアドレスを認証する方法をご覧いただきました。 こうした認証を実行するにあたり、貴社のウェブサイトの登録プロセスを変更する必要があるかもしれません。
その最良の方法は、非常に簡単です。ユーザーが登録フォームに必要事項を入力して送信すると、次のようになります:
- ウェブサーバーでフォームデータを受け取る。
- メールアドレスを含む、ユーザーの登録データを解析する。
- email-verifierライブラリを使用して、ユーザーのメールアドレスを即座に認証する。
- メールアドレスが無効な場合、ユーザーにエラーを表示し、再試行を促す。
- 問題がなければ、ユーザーの新しいアカウントを作成し、ログインさせる。
こうしたステップを踏むことで、ユーザーのタイプミスや間違いを登録プロセスの早い段階で発見し、ウェブサイトの登録フローを大幅に改善することができます。
まとめ
ユーザーのメールアドレスの認証は、貴社のウェブサイトのユーザー体験を向上させるシンプルな方法です。
新しいemail-verifier は、さまざまな種類のメールアドレス認証を扱うことができる非常に柔軟なツールです。
ご質問がございましたら、こちらにメールでお問い合わせください。