正規表現を使用してフォーム入力をチェックし、それが正しいスタイルのEメールアドレスであることを確認するための良い方法はありますか?昨夜から検索されていて、このトピックに関する人々の質問に答えた人も、サブドメインの電子メールアドレスであれば問題があるようです。
意味はありません。電子メールアドレスが構文的に有効であることを確認できたとしても、それが誤って入力されたものではないこと、および実際に正しいと判断した人に届くことを確認する必要があります。それを行う唯一の方法は、彼らにEメールを送り、確認するためにリンクをクリックさせることです。
したがって、最も基本的なチェック(たとえば、誤って住所を入力しなかったことなど)で通常は十分です。以下のようなものです:それはちょうど1つの@
サインと、.
の後の部分に少なくとも1つの@
を持っています:
[^@]+@[^@]+\.[^@]+
おそらく空白も許可したくないでしょう - おそらく空白を含む有効な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サーバーと通信して、アドレスが存在することを確認します。しかし、これはまだそれが正しい人物に属することを保証するものではありません。
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('invalid@example,com') # notice the comma
('', 'invalid@example')
>>> 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 = 'foo@[email protected]'.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
をキャッチすることで、NoAnswer
とNXDOMAIN
の両方をキャッチできます。
はい、foo@[email protected]
は構文上有効なアドレスです。ドメイン部分の開始位置を検出するためには、最後の@
のみを考慮する必要があります。
私はカスタム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
電子メールアドレスは見かけほど単純ではありません。たとえば、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"
私は有効な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]", "[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.`?{}]+@\w+\.\w+)\"?"
# here i test my function passing my pattern
test_email(pattern)
ここにはたくさんの複雑な答えがあります。そのうちのいくつかは、簡単な知識、真の電子メールアドレスを知らない、または誤検知をしています。以下は、文字列が有効な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))
これは通常、正規表現を使用して解決されます。ただし、解決策にはさまざまなバリエーションがあります。あなたがどれだけ厳しくする必要があるかによって、そしてあなたが検証のためのカスタム要件を持っているかどうか、またはどんな有効なEメールアドレスでも受け入れるでしょう。
参照用にこのページを参照してください。 http://www.regular-expressions.info/email.html
電子メールアドレスは非常に複雑です。これはすべての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
しかし、完璧な構文解析が必要か単純なコードが必要かを判断する必要があります。
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
return 1
else:
return 0
validate_email docs を参照してください。
長い文字列やファイルからメールを取り出したいのなら、これを試してください。
([^@|\s]+@[^@]+\.[^@|\s]+)
あなたのEメールアドレスの前後にスペースがあるとき、これはうまくいくでしょう。スペースがない、または特別な文字がある場合は、それを変更してみてください。
作業例:
string="Hello ABCD, here is my mail id [email protected] "
res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I)
res.group(1)
これは、この文字列から[email protected]を取り出します。
また、これが正しい答えではないかもしれないことに注意してください。
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()
上記のparseaddrは末尾の@を無視します。
from email.utils import parseaddr
parseaddr('aaa@[email protected]') ('', 'aaa@bbb')
おそらく住所を抽出して、元の住所と比較しますか?
誰かがvalidate.emailを試してみましたか?
電子メールの入力にこのフィルタマスクを使用します。emailMask:/[\w.\-@'"!#$%&'*+/=?^_
{|}〜]/i`
Email-idを探す:
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..
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("test@gmailcom")
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
これが実用的な実装であることがわかりました。
[^@\s]+@[^@\s]+\.[^@\s]+