Python でメールアドレスを検証する

Olorunfemi Akinlua 2023年6月21日
  1. regex を使用して Python でメールを検証する
  2. dnspython を使用して Python でメールを検証する
Python でメールアドレスを検証する

電子メールの検証は、クローズド アプリケーション内でのユーザー ジャーニーの重要な部分であり、特にセキュリティとユーザー チャーンの削減にとって重要です。 電子メールを検証するにはさまざまな方法があり、一般的な電子メール アドレスの構造を理解することが重要です。

regex などの組み込み機能や、これらのプロセスを支援する dnspython などのライブラリがあります。 この記事では、これらの機能とライブラリを使用して Python でメールを検証する方法について説明します。

regex を使用して Python でメールを検証する

一般に regex と呼ばれる正規表現は、テキスト内の検索パターンを指定する一連の文字であり、文字列の検索アルゴリズムや 検索 および 検索と置換 を実行するのに役立ちます。

regex を使用すると、ユーザーから受け取ったメール アドレスから特定のパターンを見つけることができます。 すべての電子メール アドレスは、[ユーザー名]@[smtp サーバー].com という同じパターンを持っています。

regex を使用して、username 部分と SMTP server 部分を見つけることができます。 regex の使い方を理解するには、メタ文字、特殊なシーケンス、およびセット について知っておく必要があります。

この知識を使用して、compile メソッドを使用して regex パターンを作成およびコンパイルし、match メソッドを使用してユーザーの電子メール アドレスの文字列を比較して検証することができます。 Python で regex を使用するには、正規表現をサポートする re ライブラリが必要です。

import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.match(pattern, user_email):
    print(f"{user_email} is not a valid email address")
else:
    print(f"Your {user_email} is a valid email address")

出力:

PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: akin@gm.com
Your akin@gm.com is a valid email address
PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: dx@s
dx@s is not a valid email address

\"?([-a-zA-Z0-9.?{}]+@\w+\.\w+)\"? 文字列には、ユーザーの電子メール アドレスと比較する正規表現パターンが含まれます。

最初の入力 akin@gm.com では、電子メールには、ユーザー名から SMTP サーバーへの有効な電子メールを作成するために必要なすべてのパターンと構造が含まれています。 ただし、dx@s の場合、SMTP サーバーは存在しません。

Python 3.x で最も好まれる fullmatch メソッド を使用して一致をチェックすることもできます。 コードは似ていますが、変更する必要があるのは、match メソッドを fullmatch に変更することだけです。

matchfullmatch の違いは、match は先頭のみに一致するのに対し、fullmatch は文字列テキスト全体から最後まで一致することです。

import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.fullmatch(pattern, user_email):
    print(f"{user_email} is not a valid email address")
else:
    print(f"Your {user_email} is a valid email address")

出力:

PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: akin@gmail.com
Your akin@gmail.com is a valid email address

これにより、有効なメール構造を確認できますが、同様に重要な SMTP サーバーが存在するかどうかは確認できません。 そこで登場するのが次の機能です。

dnspython を使用して Python でメールを検証する

dnspython ライブラリを使用すると、電子メールの SMTP 部分を検証して、それが実際のものであり、でっちあげではないかどうかを確認できます。 電子メールを確認して検証した後、SMTP サーバーの一部を分割し、resolve メソッドを使用して確認できます。

dnspython は組み込みライブラリではないため、pip を介してインストールする必要があります。

pip install dnspython

dnspython をインストールした後、それをコードにインポートし、resolve メソッドを使用して有効な SMTP サーバーを確認できます。

import dns.resolver

try:
    answers = dns.resolver.resolve("google.com", "MX")
    for rdata in answers:
        print("Host", rdata.exchange, "has preference", rdata.preference)
    print(bool(answers))
except dns.exception.DNSException as e:
    print("Email Doesn't Exist")

出力:

Host smtp.google.com. has preference 10
True

SMTP サーバーを確認するには、MX 属性を resolve メソッドに渡して mail exchange レコードを確認します。返された rdata は、exchange および preference 属性の値を確認するのに役立ちます。

ただし、重要なのは、bool 関数を使用して answer バインディング内に値があるかどうかを確認することです。 そこに値がない場合は、SMTP サーバー が無効であることを意味します。

包括的な電子メール検証チェックを行うために、regex コードと dnspython コードを組み合わせることができます。

import dns.resolver
import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.fullmatch(pattern, user_email):
    print(f"{user_email} is not a valid email address.")
else:
    domain = user_email.rsplit("@", 1)[-1]

    try:
        answers = dns.resolver.resolve(domain, "MX")
        if bool(answers):
            print(f"Your {user_email} is a valid email address.")
    except dns.exception.DNSException as e:
        print("Not a valid email server.")

出力:

PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: akin@gmail.com
Your akin@gmail.com is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: ds.cem@fex.co
Your ds.cem@fex.co is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: wer@fghj.com
Your wer@fghj.com is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: df@werabsjaksa.com
Not a valid email server.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: des@python.exe
Not a valid email server.

try/except セクションは、SMTP サーバー が存在しない場合に特定の例外を処理するのに役立ちます。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - Python Email