正規表現を使用してフォーム入力をチェックし、それが適切なスタイルの電子メールアドレスであることを確認する良い方法はありますか?昨夜から検索を続けており、このトピックに関する人々の質問に答えた人は、サブドメイン化された電子メールアドレスの場合も問題があるようです。
18 に答える
意味はありません。電子メール アドレスが構文的に有効であることを確認できたとしても、入力ミスがなく、実際に送信先と思われる人に送信されていることを確認する必要があります。これを行う唯一の方法は、電子メールを送信し、リンクをクリックして確認することです。
したがって、通常は最も基本的なチェック (住所を間違って入力していないかどうかなど) で十分です。のようなもの: 正確に 1 つの@
符号があり、少なくとも 1 つ.
が の後の部分にあり@
ます。
[^@]+@[^@]+\.[^@]+
また、空白を禁止したい場合もあります。空白を含む有効な電子メール アドレスが存在する可能性がありますが、私は見たことがないので、これがユーザー エラーである可能性はあなたの側にあります。
完全なチェックが必要な場合は、この質問をご覧ください。
更新: そのような正規表現を使用する方法は次のとおりです。
import re
if not re.match(r"... regex here ...", email):
# whatever
Python ≥3.4 にre.fullmatch
は、より好ましいものがありre.match
ます。
r
文字列の前に注意してください。この方法では、物事を 2 回エスケープする必要はありません。
チェックする正規表現が多数ある場合は、最初に正規表現をコンパイルする方が速い場合があります。
import re
EMAIL_REGEX = re.compile(r"... regex here ...")
if not EMAIL_REGEX.match(email):
# whatever
もう 1 つのオプションはvalidate_email
、実際に SMTP サーバーに接続してアドレスが存在することを確認するパッケージを使用することです。ただし、これは、それが正しい人に属していることを保証するものではありません.
Python標準ライブラリには、電子メール解析関数が付属していますemail.utils.parseaddr()
。
これは、電子メールの実際の名前と実際のアドレスの部分を含む2つのタプルを返します。
>>> from email.utils import parseaddr
>>> parseaddr('foo@example.com')
('', 'foo@example.com')
>>> parseaddr('Full Name <full@example.com>')
('Full Name', 'full@example.com')
>>> parseaddr('"Full Name with quotes and <weird@chars.com>" <weird@example.com>')
('Full Name with quotes and <weird@chars.com>', 'weird@example.com')
また、解析が失敗した場合は、2タプルの空の文字列が返されます。
>>> parseaddr('[invalid!email]')
('', '')
このパーサーの問題は、RFC-822やその友人にとって有効な電子メールアドレスと見なされるものすべてを受け入れることです。これには、広いインターネットでは明らかにアドレスできない多くのものが含まれます。
>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')
>>> parseaddr('invalid-email')
('', 'invalid-email')
したがって、@ TokenMacGuyが述べているように、電子メールアドレスを確認する唯一の決定的な方法は、期待されるアドレスに電子メールを送信し、ユーザーがメッセージ内の情報に基づいて行動するのを待つことです。
ただし、@ bvukelicが示唆しているように、少なくとも2番目のタプル要素に@記号が存在するかどうかを確認することをお勧めします。
>>> '@' in parseaddr("invalid-email")[1]
False
さらに一歩進めたい場合は、dnspythonMX
プロジェクトをインストールして、電子メールドメイン(「@」の後の部分)のメールサーバーを解決し、実際のサーバーがある場合にのみ電子メールを送信しようとします。
>>> from dns.resolver import query
>>> domain = 'foo@bar@google.com'.rsplit('@', 1)[-1]
>>> bool(query(domain, 'MX'))
True
>>> query('example.com', 'MX')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
[...]
dns.resolver.NXDOMAIN
とを混獲することで両方NoAnswer
をNXDOMAIN
捕まえることができdns.exception.DNSException
ます。
はい、foo@bar@google.com
構文的に有効なアドレスです。ドメイン部分がどこから始まるかを検出するために、最後のものだけ@
を考慮する必要があります。
カスタム正規表現の回答の混乱の中で、ここで回答をまだ見ていませんが...
py3-validate-email validate_emailと呼ばれる python ライブラリが存在します。これには、電子メール アドレスが有効かどうか (電子メールを送信せずに) 有効な SMTP サーバーに問い合わせるなど、3 レベルの電子メール検証があります。
インストールするには
python -m pip install py3-validate-email
基本的な使い方:
from validate_email import validate_email
is_valid = validate_email(email_address='example@example.com', \
check_regex=True, check_mx=True, \
from_address='my@from.addr.ess', helo_host='my.host.name', \
smtp_timeout=10, dns_timeout=10, use_blacklist=True)
汚い詳細に興味がある人のために、validate_email.py ( source ) はRFC 2822に忠実であることを目指しています。
実際に行っているのは、入力文字列を 1 つの巨大な正規表現と比較することだけです。しかし、その正規表現を構築し、その正確性を保証することは、RFC によって定義された「トークン」から組み立てることによって、はるかに簡単になります。これらの各トークンは、付属の単体テスト ファイルでテストされます。
SMTPサーバーをチェックするためにpyDNSモジュールが必要になる場合があります
pip install pyDNS
またはUbuntuから
apt-get install python3-dns
メールアドレスは見た目ほど単純ではありません! たとえば、Bob_O'Reilly+tag@example.com は有効な電子メール アドレスです。
私は lepl パッケージ ( http://www.acooke.org/lepl/ ) で運が良かったです。RFC 3696: http://www.faqs.org/rfcs/rfc3696.htmlに示されているように、電子メール アドレスを検証できます。
古いコードが見つかりました:
import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("email@example.com"):
print "Invalid email"
ここには複雑な答えがたくさんあります。それらのいくつかは、単純で真のメールアドレスを知らないか、誤検知を持っています. 以下は、文字列が有効な電子メールであることをテストする最も簡単な方法です。2 文字および 3 文字の TLD に対してテストします。技術的にはより大きなものを使用できるようになったので、3 を 4、5、または 10 に増やしたいと思うかもしれません。
import re
def valid_email(email):
return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
これは通常、正規表現を使用して解決されます。ただし、ソリューションには多くのバリエーションがあります。どの程度厳密にする必要があるか、検証のカスタム要件があるかどうか、または有効な電子メールアドレスを受け入れるかどうかによって異なります。
このページを参照してください: http://www.regular-expressions.info/email.html
メールアドレスは非常に複雑です。以下は、すべての RFC822 有効なアドレスに一致する正規表現の例です: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
おそらく、プログラムの残りの部分よりも長いことに気付くでしょう。メールアドレスを検証する目的で、Perl 用の完全なモジュールさえあります。したがって、正規表現として 100% 完璧でありながら読みやすいものはおそらく得られないでしょう。サンプルの再帰降下パーサーは次のとおりです。
ただし、完全な解析が必要か、単純なコードが必要かを判断する必要があります。
import re
def email():
email = raw_input("enter the mail address::")
match = re.search(r'[\w.-]+@[\w.-]+.\w+', email)
if match:
print "valid email :::", match.group()
else:
print "not valid:::"
email()
長い文字列やファイルからメールを取り出したい場合は、これを試してください。
([^@|\s]+@[^@]+\.[^@|\s]+)
これは、メールアドレスの前後にスペースがある場合に機能することに注意してください。スペースがない場合や特殊な文字がある場合は、変更してみてください。
作業例:
string="Hello ABCD, here is my mail id example@me.com "
res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I)
res.group(1)
これは、この文字列から取り出しexample@me.com
ます。
また、これは正しい答えではないかもしれないことに注意してください...しかし、私のような特定の要件を持つ人を助けるためにここに投稿しました
電子メールのチェックには、email_validatorを使用します
from email_validator import validate_email, EmailNotValidError
def check_email(email):
try:
v = validate_email(email) # validate and get info
email = v["email"] # replace with normalized form
print("True")
except EmailNotValidError as e:
# email is not valid, exception message is human-readable
print(str(e))
check_email("test@gmailcom")
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
実際の有効な電子メール アドレスと無効な電子メール アドレスを正確に区別する唯一の方法は、そのアドレスにメールを送信することです。電子メールとしてカウントされるものは驚くほど複雑で ("John Doe" <john.doe@example.com>"
実際には有効な電子メール アドレスです)、実際に電子メール アドレスに後で実際にメールを送信したい場合がほとんどです。いくつかの基本的な健全性チェック (Thomas の回答のように、 の後に@
と が少なくとも 1つある) に合格したら、おそらくそのアドレスに確認メールを送信し、ユーザーがメッセージに埋め込まれたリンクをたどるのを待つ必要があります。電子メールが有効であることを確認します。.
@