web-dev-qa-db-ja.com

有効なメールアドレスを確認する方法

正規表現を使用してフォーム入力をチェックし、それが正しいスタイルのEメールアドレスであることを確認するための良い方法はありますか?昨夜から検索されていて、このトピックに関する人々の質問に答えた人も、サブドメインの電子メールアドレスであれば問題があるようです。

166
Bobby

意味はありません。電子メールアドレスが構文的に有効であることを確認できたとしても、それが誤って入力されたものではないこと、および実際に正しいと判断した人に届くことを確認する必要があります。それを行う唯一の方法は、彼らにEメールを送り、確認するためにリンクをクリックさせることです。

したがって、最も基本的なチェック(たとえば、誤って住所を入力しなかったことなど)で通常は十分です。以下のようなものです:それはちょうど1つの@サインと、.の後の部分に少なくとも1つの@を持っています:

[^@][email protected][^@]+\.[^@]+

おそらく空白も許可したくないでしょう - おそらく空白を含む有効なEメールアドレスがありますが、私は一度も見たことがないので、これがユーザーエラーである可能性はあなたの側にあります。

あなたが完全なチェックをしたいならば、 この質問 を見てください。


更新:そのような正規表現を使用する方法は次のとおりです。

import re

if not re.match(r"... regex here ...", email):
  # whatever

Python≥3.4には re.fullmatch があり、これはre.matchより望ましいです。

文字列の前にあるrに注意してください。こうすれば、物事を二度逃げる必要がなくなります。

チェックする正規表現がたくさんある場合は、最初に正規表現をコンパイルするほうが速いかもしれません。

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever

もう1つの選択肢は、 validate_email パッケージを使用することです。これは実際にSMTPサーバーと通信して、アドレスが存在することを確認します。しかし、これはまだそれが正しい人物に属することを保証するものではありません。

233
Thomas

Python標準ライブラリには、電子メール解析関数が付属しています。 email.utils.parseaddr()

これは、電子メールの実際の名前と実際のアドレス部分を含む2つのタプルを返します。

>>> from email.utils import parseaddr
>>> parseaddr('[email protected]')
('', '[email protected]')

>>> parseaddr('Full Name <[email protected]>')
('Full Name', '[email protected]')

>>> parseaddr('"Full Name with quotes and <[email protected]>" <[email protected]>')
('Full Name with quotes and <[email protected]>', '[email protected]')

そして解析が失敗した場合、空の文字列の2タプルを返します。

>>> parseaddr('[invalid!email]')
('', '')

このパーサーの問題点は、RFC-822やその友人たちにとって有効なEメールアドレスと見なされるものすべてを受け入れていることです。

>>> parseaddr('[email protected],com') # notice the comma
('', '[email protected]')

>>> parseaddr('invalid-email')
('', 'invalid-email')

@TokenMacGuyが言っているように、電子メールアドレスを確認する唯一の確実な方法は、予期されたアドレスに電子メールを送信し、ユーザーがメッセージ内の情報を処理するのを待つことです。

ただし、@ bvukelicが示唆するように、少なくとも2番目のTuple要素に@記号が存在することを確認することをお勧めします。

>>> '@' in parseaddr("invalid-email")[1]
False

さらに一歩進めたい場合は、 dnspython プロジェクトをインストールして、Eメールドメイン( '@'の後の部分)のメールサーバーを解決し、Eメールを送信します。実際のMXサーバーがある場合はmail:

>>> from dns.resolver import query
>>> domain = '[email protected]@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

dns.exception.DNSExceptionをキャッチすることで、NoAnswerNXDOMAINの両方をキャッチできます。

はい、[email protected]@google.comは構文上有効なアドレスです。ドメイン部分の開始位置を検出するためには、最後の@のみを考慮する必要があります。

112
LeoRochael

私はカスタムRegex回答の混乱の中ですでにここで答えを見たことがありません、しかし...

validate_emailという名前のpythonライブラリが存在します。これには、有効なSMTPサーバーに電子メールアドレスがあるかどうかを確認することも含まれます。有効です(Eメールを送信せずに)。

電子メールの文字列を確認してください。

from validate_email import validate_email
is_valid = validate_email('[email protected]')

ホストにSMTPサーバーがあるかどうかを確認します。

is_valid = validate_email('[email protected]',check_mx=True)

ホストにSMTPサーバーがあり、電子メールが本当に存在するかどうかを確認します。

is_valid = validate_email('[email protected]',verify=True)

汚い詳細に興味がある人のために、validate_email.py( source )は RFC 2822 に忠実であることを目指しています。

実際に行っているのは、入力文字列を1つの巨大な正規表現と比較することだけです。しかし、その正規表現を構築し、その正当性を保証することは、RFCで定義されている「トークン」からそれを組み立てることによって、はるかに簡単になります。これらの各トークンは、添付の単体テストファイルでテストされています。


Pipでインストールする

pip install validate_email

sMTPサーバーをチェックするにはpyDNSモジュールが必要です。

pip install pyDNS

またはUbuntuから

apt-get python3-dns
55
philshem

電子メールアドレスは見かけほど単純ではありません。たとえば、Bob_O'[email protected]は有効なメールアドレスです。

私は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 protected]"):
    print "Invalid email"
21
bigendian

私は有効なEメールアドレスをチェックするための優れた(そしてテストされた)方法を見つけました。ここにコードを貼り付けます。

# here i import the module that implements regular expressions
import re
# here is my function to check for valid email address
def test_email(your_pattern):
pattern = re.compile(your_pattern)
# here is an example list of email to check it at the end
emails = ["[email protected]", "python-lis[email protected]", "wha.t.`1an?ug{}[email protected]"]
for email in emails:
    if not re.match(pattern, email):
        print "You failed to match %s" % (email)
    Elif not your_pattern:
        print "Forgot to enter a pattern!"
    else:
        print "Pass"
# my pattern that is passed as argument in my function is here!
pattern = r"\"?([-a-zA-Z0-9.`?{}][email protected]\w+\.\w+)\"?"   
# here i test my function passing my pattern
test_email(pattern)
9
James The Beard

ここにはたくさんの複雑な答えがあります。そのうちのいくつかは、簡単な知識、真の電子メールアドレスを知らない、または誤検知をしています。以下は、文字列が有効なEメールであることをテストする最も簡単な方法です。 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))
8
PyTis

これは通常、正規表現を使用して解決されます。ただし、解決策にはさまざまなバリエーションがあります。あなたがどれだけ厳しくする必要があるかによって、そしてあなたが検証のためのカスタム要件を持っているかどうか、またはどんな有効なEメールアドレスでも受け入れるでしょう。

参照用にこのページを参照してください。 http://www.regular-expressions.info/email.html

4
Mithon

電子メールアドレスは非常に複雑です。これはすべてのRFC822有効なアドレスにマッチするサンプル正規表現です: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

あなたはそれがおそらくあなたのプログラムの他の部分より長いことに気づくでしょう。 Eメールアドレスを検証することを目的としたPerl用のモジュールさえあります。だから、あなたはおそらく正規表現として100%完璧なものは何も手に入れられないでしょうが、同時に読めることもあるでしょう。再帰降下パーサの例を次に示します。 http://cpansearch.Perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

しかし、完璧な構文解析が必要か単純なコードが必要かを判断する必要があります。

3
Dan
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

validate_email docs を参照してください。

3
ali.etemadi77

長い文字列やファイルからメールを取り出したいのなら、これを試してください。

([^@|\s][email protected][^@]+\.[^@|\s]+)

あなたのEメールアドレスの前後にスペースがあるとき、これはうまくいくでしょう。スペースがない、または特別な文字がある場合は、それを変更してみてください。

作業例:

string="Hello ABCD, here is my mail id [email protected] "
res = re.search("([^@|\s][email protected][^@]+\.[^@|\s]+)",string,re.I)
res.group(1)

これは、この文字列から[email protected]を取り出します。

また、これが正しい答えではないかもしれないことに注意してください。

2
Raj Chinna
import re
def email():
    email = raw_input("enter the mail address::")
     match = re.search(r'[\w.-][email protected][\w.-]+.\w+', email)

    if match:
        print "valid email :::", match.group()
    else:
        print "not valid:::"

email()
2
nidhin

上記のparseaddrは末尾の@を無視します。

from email.utils import parseaddr
parseaddr('[email protected]@ccc.com') ('', '[email protected]')

おそらく住所を抽出して、元の住所と比較しますか?

誰かがvalidate.emailを試してみましたか?

1
Serge

電子メールの入力にこのフィルタマスクを使用します。emailMask:/[\w.\[email protected]'"!#$%&'*+/=?^_ {|}〜]/i`

0
Dilip Paudel

Email-idを探す: finding IP screenshot

import re 
a=open("aa.txt","r")
#c=a.readlines() 
b=a.read()
c=b.split("\n")
print(c)
  for d in c: 
    obj=re.search(r'[\w.]+\@[\w.]+',d)
    if obj:
      print(obj.group())  
#for more calcification click on image above..
0
Mani

Eメールの使用をチェックするためには 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("[email protected]")
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
0
Anu

これが実用的な実装であることがわかりました。

[^@\s][email protected][^@\s]+\.[^@\s]+
0
juan Isaza