wake-up-neo.net

Wie prüfe ich nach einer gültigen E-Mail-Adresse?

Gibt es eine gute Möglichkeit, eine Formulareingabe mit Regex zu überprüfen, um sicherzustellen, dass es sich um eine E-Mail-Adresse handelt, die den richtigen Stil hat? Seit gestern Abend gesucht und jeder, der die Fragen der Benutzer zu diesem Thema beantwortet hat, scheint auch Probleme damit zu haben, wenn es sich um eine untergeordnete E-Mail-Adresse handelt.

154
Bobby

Es hat keinen Sinn. Selbst wenn Sie überprüfen können, ob die E-Mail-Adresse syntaktisch gültig ist, müssen Sie trotzdem überprüfen, dass sie nicht falsch geschrieben wurde und tatsächlich an die Person geht, von der Sie glauben, dass sie dies tut. Die einzige Möglichkeit, dies zu tun, besteht darin, ihnen eine E-Mail zu senden und sie auf einen zu bestätigenden Link klicken zu lassen.

Daher ist eine grundlegende Überprüfung (z. B., dass die Adresse nicht versehentlich nicht eingegeben wurde) normalerweise ausreichend. Etwas wie: Es hat genau ein @-Zeichen und mindestens einen . im Teil nach dem @:

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

Wahrscheinlich möchten Sie auch Whitespace nicht zulassen - wahrscheinlich gibt es gültige E-Mail-Adressen mit Whitespace, aber ich habe noch nie eine davon gesehen. Die Wahrscheinlichkeit, dass dies ein Benutzerfehler ist, liegt auf Ihrer Seite.

Wenn Sie die vollständige Überprüfung durchführen möchten, schauen Sie sich diese Frage an.


Update: So können Sie solche Regex verwenden:

import re

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

Beachten Sie die r vor dem String. Auf diese Weise müssen Sie den Dingen nicht zweimal entkommen.

Wenn Sie eine große Anzahl von Regexen überprüfen müssen, ist es möglicherweise schneller, den Regex zuerst zu kompilieren:

import re

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

if not EMAIL_REGEX.match(email):
  # whatever

Eine andere Option ist die Verwendung des Pakets validate_email , das den SMTP-Server tatsächlich kontaktiert, um zu überprüfen, ob die Adresse vorhanden ist. Dies garantiert jedoch noch nicht, dass es der richtigen Person gehört.

220
Thomas

Die Python-Standardbibliothek enthält eine E-Mail-Parsing-Funktion: email.utils.parseaddr() .

Es wird ein Tupel zurückgegeben, der den tatsächlichen Namen und die tatsächlichen Adressbestandteile der E-Mail enthält:

>>> 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]')

Wenn das Parsen nicht erfolgreich ist, wird ein zwei-Tuple leerer Zeichenfolgen zurückgegeben:

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

Ein Problem bei diesem Parser ist, dass er alles akzeptiert, was als gültige E-Mail-Adresse für RFC-822 und Freunde gilt, einschließlich vieler Dinge, die im breiten Internet eindeutig nicht adressierbar sind:

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

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

Wie @TokenMacGuy es formuliert, besteht der einzige endgültige Weg zum Überprüfen einer E-Mail-Adresse darin, eine E-Mail an die erwartete Adresse zu senden und darauf zu warten, dass der Benutzer die Informationen in der Nachricht verarbeitet.

Sie sollten jedoch zumindest nach dem Vorhandensein eines @ -Zeichen auf dem zweiten Tuple-Element suchen, wie @bvukelic vorschlägt:

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

Wenn Sie einen Schritt weiter gehen möchten, können Sie das dnspython project installieren und die Mail-Server für die E-Mail-Domäne (den Teil nach dem "@") auflösen, wobei nur versucht wird, eine E-Mail zu senden, wenn diese vorhanden ist sind MX Server:

>>> 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

Sie können sowohl NoAnswer als auch NXDOMAIN abfangen, indem Sie dns.exception.DNSException abfangen.

Und ja, [email protected]@google.com ist eine syntaktisch gültige Adresse. Es sollte nur der letzte @ berücksichtigt werden, um herauszufinden, wo der Domain-Teil beginnt.

102
LeoRochael

Ich habe die Antwort hier nicht schon im Chaos der benutzerdefinierten Regex-Antworten gesehen, aber ...

Python verfügt über ein Modul mit dem Namen validate_email, das drei Gültigkeitsstufen für die E-Mail-Gültigkeit hat, einschließlich der Abfrage eines gültigen SMTP-Servers, wenn die E-Mail-Adresse gültig ist (ohne eine E-Mail zu senden).

Überprüfen Sie, ob die E-Mail-Zeichenfolge ein gültiges Format hat:

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

Überprüfen Sie, ob der Host über einen SMTP-Server verfügt:

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

Prüfen Sie, ob der Host über einen SMTP-Server verfügt und die E-Mail wirklich vorhanden ist:

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

Für diejenigen, die an den schmutzigen Details interessiert sind, zielt validate_email.py ( source ) darauf ab, RFC 2822 treu zu sein.

Alles, was wir wirklich tun, ist, die Eingabezeichenfolge mit einer .__ zu vergleichen. gigantischer regulärer Ausdruck. Aber das bauen dieser Regex und Sicherstellung der Korrektheit wird durch die Montage wesentlich erleichtert von den vom RFC definierten "Tokens". Jeder dieser Token ist in der beiliegenden Unit-Testdatei getestet.


Zu installieren mit pip

pip install validate_email

und Sie benötigen das pyDNS-Modul zur Überprüfung von SMTP-Servern

pip install pyDNS

oder von Ubuntu

apt-get python3-dns
51
philshem

E-Mail-Adressen sind nicht so einfach, wie es scheint! Beispielsweise ist Bob_O'[email protected] eine gültige E-Mail-Adresse.

Ich hatte etwas Glück mit dem lepl-Paket ( http://www.acooke.org/lepl/ ). Es kann E-Mail-Adressen wie in RFC 3696 angegeben validieren: http://www.faqs.org/rfcs/rfc3696.html

Ich habe alten Code gefunden:

import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("[email protected]"):
    print "Invalid email"
22
bigendian

Ich habe eine ausgezeichnete (und getestete) Methode gefunden, um nach einer gültigen E-Mail-Adresse zu suchen. Ich füge meinen Code hier ein:

# 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.`?{}][email protected]\w+\.\w+)\"?"   
# here i test my function passing my pattern
test_email(pattern)
8
James The Beard

Ich sehe hier viele komplizierte Antworten. Einige von ihnen kennen keine einfache, echte E-Mail-Adresse oder haben falsch positive Ergebnisse. Nachfolgend wird am einfachsten getestet, ob es sich bei der Zeichenfolge um eine gültige E-Mail handelt. Es testet gegen TLDs mit 2 und 3 Buchstaben. Jetzt, wo Sie technisch größere haben können, möchten Sie vielleicht die 3 auf 4, 5 oder sogar 10 erhöhen.

import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
7
PyTis

Dieses Problem wird normalerweise mit Regex gelöst. Es gibt jedoch viele Lösungsvarianten. Je nachdem, wie streng Sie sein müssen, ob Sie benutzerdefinierte Anforderungen für die Validierung haben oder eine gültige E-Mail-Adresse akzeptieren. 

Siehe diese Seite als Referenz: http://www.regular-expressions.info/email.html

4
Mithon

E-Mail-Adressen sind unglaublich kompliziert. Hier ein Beispiel für einen regulären Ausdruck, der mit jeder RFC822-gültigen Adresse übereinstimmt: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

Sie werden feststellen, dass es wahrscheinlich länger ist als der Rest Ihres Programms. Es gibt sogar ganze Module für Perl, um E-Mail-Adressen zu überprüfen. Sie werden also wahrscheinlich nichts 100% perfektes Regex bekommen und gleichzeitig lesbar sein. Hier ist ein Beispiel für einen rekursiven Abstiegsparser: http://cpansearch.Perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

sie müssen jedoch entscheiden, ob Sie perfektes Parsen oder einfachen Code benötigen.

3
Dan

Der oben genannte Parseadr würde das nachfolgende @ ignorieren.

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

Wahrscheinlich Adresse extrahieren und mit dem Original vergleichen?

Hat jemand validate.email versucht?

1
Serge

Wenn Sie die Mail aus einer langen Zeichenfolge oder Datei herausnehmen möchten, probieren Sie dies aus. 

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

Beachten Sie, dass dies funktioniert, wenn Sie vor und nach Ihrer E-Mail-Adresse ein Leerzeichen haben. Wenn Sie keinen Platz haben oder spezielle Zeichen haben, können Sie versuchen, es zu ändern.

Arbeitsbeispiel:

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

Dadurch wird [email protected] aus dieser Zeichenfolge entfernt. 

Beachten Sie, dass dies möglicherweise nicht die richtige Antwort ist. Aber ich habe sie hier veröffentlicht, um jemandem zu helfen, der bestimmte Anforderungen wie mich hat

1
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()
1
nidhin
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

Siehe validate_email docs .

1
ali.etemadi77

Verwenden Sie diese Filtermaske für die E-Mail-Eingabe: EmailMask: /[\w.\[email protected]'"!#$%&'*+/=?^_ {|} ~]/i`

0
Dilip Paudel

E-Mail-ID finden: 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

Zur Überprüfung der E-Mail verwenden Sie 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

Fand dies für eine praktische Implementierung:

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