Python sprawdź poprawny adres e-mail?

Czy istnieje dobry sposób, aby sprawdzić wprowadzenie formularza za pomocą regex, aby upewnić się, że jest to właściwy adres e-mail w stylu? Szukam od wczoraj i każdy, kto odpowiedział na pytania dotyczące tego tematu również wydaje się mieć z nim problemy, jeśli jest to subdomena adres e-mail.

Author: user1937198, 2011-11-05

18 answers

Nie ma sensu. Nawet jeśli możesz zweryfikować, że adres e-mail jest poprawny składniowo, nadal musisz sprawdzić, czy nie został błędnie wpisany i czy rzeczywiście trafia do osoby, o której myślisz, że tak. Jedynym sposobem, aby to zrobić, jest wysłanie im e-maila i kliknięcie linku w celu weryfikacji.

W związku z tym, najbardziej podstawowe sprawdzenie (np., że nie przypadkowo wszedł ich adres ulicy) jest zwykle wystarczające. Coś w stylu: ma dokładnie jeden znak @, a przynajmniej jeden . w część po @:

[^@]+@[^@]+\.[^@]+

Prawdopodobnie chcesz również wyłączyć białe znaki-prawdopodobnie są poprawne adresy e-mail z białymi znakami, ale nigdy takiego nie widziałem, więc szanse na to, że jest to błąd użytkownika są po twojej stronie.

Jeśli chcesz mieć pełną kontrolę, spójrz na to pytanie.


Update: Oto jak możesz używać takich regex:

import re

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

Zwróć uwagę na r przed łańcuchem; w ten sposób nie będziesz musiał uciekać od rzeczy dwa razy.

Jeśli masz dużą liczbę wyrażeń regularnych do sprawdzenia, może być szybciej skompilować wyrażenia regularne najpierw:

import re

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

if not EMAIL_REGEX.match(email):
  # whatever

Inną opcją jest użycie validate_email pakiet, który faktycznie kontaktuje się z serwerem SMTP w celu sprawdzenia, czy adres istnieje. To jednak nadal nie gwarantuje, że należy do właściwej osoby.

 203
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 10:35:58

Standardowa biblioteka Pythona jest wyposażona w funkcję parsowania poczty e-mail: email.utils.parseaddr().

Zwraca dwie krotki zawierające prawdziwą nazwę i rzeczywisty adres części e-mail:

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

I jeśli parsowanie nie powiedzie się, zwraca dwie krotki pustych łańcuchów:

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

Problem z tym parserem polega na tym, że akceptuje wszystko, co jest uważane za poprawny adres e-mail dla RFC-822 i znajomych, w tym wiele rzeczy, które wyraźnie nie są adresowalny w szerokim Internecie:

>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')

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

Tak więc, jak ujął to @TokenMacGuy, jedynym ostatecznym sposobem sprawdzenia adresu e-mail jest wysłanie e-maila na oczekiwany adres i oczekiwanie na działanie Użytkownika na informacje wewnątrz wiadomości.

Możesz jednak sprawdzić obecność znaku @na drugim elemencie krotki, jak sugeruje @bvukelic:

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

Jeśli chcesz pójść o krok dalej, możesz zainstalować projekt dnspython i rozwiązanie serwerów pocztowych dla domeny e-mail (część po'@'), próba wysłania e-maila tylko wtedy, gdy istnieją rzeczywiste serwery MX:

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

Możesz złapać zarówno NoAnswer, jak i NXDOMAIN, łapiąc dns.exception.DNSException.

I tak, foo@[email protected] jest poprawnym adresem skÅ‚adniowym. Tylko ostatnia @ powinna być brana pod uwagÄ™ przy wykrywaniu, gdzie zaczyna siÄ™ część domeny.

 92
Author: LeoRochael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 18:45:31

Nie widziałem jeszcze odpowiedzi tutaj wśród bałaganu niestandardowych odpowiedzi Regex, ale...

Python posiada moduł o nazwie validate_email który ma 3 poziomy walidacji wiadomości e-mail, w tym pytanie poprawnego serwera SMTP, czy adres e-mail jest prawidłowy (bez wysyłania wiadomości e-mail).

Sprawdź poprawny format łańcucha wiadomości e-mail:

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

Sprawdź czy host posiada serwer SMTP:

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

Sprawdź, czy host ma serwer SMTP i e-mail naprawdę exists:

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

Dla zainteresowanych brudnymi szczegółami, validate_email.py (source ) ma być wierny RFC 2822.

Wszystko, co tak naprawdę robimy, to porównywanie ciągu wejściowego do jednego gigantyczne Wyrażenie regularne. Ale budowanie tego wyrażenia regularnego i zapewnienie jego poprawności, jest znacznie łatwiejsze poprzez złożenie go z "tokenów" zdefiniowanych przez RFC. Każdy z tych żetonów jest sprawdzone w badaniu jednostki towarzyszącej plik.


Aby zainstalować za pomocą pip

pip install validate_email

I będziesz potrzebował modułu pyDNS do sprawdzania serwerów SMTP

pip install pyDNS

Lub z Ubuntu

apt-get python3-dns
 39
Author: philshem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 08:57:44

Adresy e-mail nie sÄ… tak proste, jak siÄ™ wydaje! Na przykÅ‚ad Bob_O ' [email protected], jest prawidÅ‚owym adresem e-mail.

Miałem trochę szczęścia z pakietem lepl ( http://www.acooke.org/lepl/). może walidować adresy e-mail, jak wskazano w RFC 3696: http://www.faqs.org/rfcs/rfc3696.html

Znalazłem jakiś stary kod:

import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("[email protected]"):
    print "Invalid email"
 22
Author: bigendian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 15:22:55

Znalazłem doskonały (i przetestowany) sposób na sprawdzenie poprawnego adresu e-mail. Wklejam tutaj swój kod:

# 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)
 5
Author: James The Beard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 11:26:48

Widzę tu wiele skomplikowanych odpowiedzi. Niektóre z nich nie znają prostego, prawdziwego adresu e-mail lub mają fałszywe alarmy. Poniżej znajduje się najprostszy sposób sprawdzenia, czy ciąg znaków będzie prawidłowym e-mailem. Testuje z 2 i 3 liter TLD. teraz, gdy technicznie można mieć większe, może chcesz zwiększyć 3 do 4, 5 lub nawet 10.

import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
 5
Author: PyTis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-12 12:23:32

Jest to zazwyczaj rozwiązywane za pomocą regex. Istnieje jednak wiele wariantów rozwiązań. W zależności od tego, jak surowy musisz być i czy masz niestandardowe wymagania dotyczące walidacji lub akceptujesz dowolny ważny adres e-mail.

Zobacz tÄ™ stronÄ™ dla odniesienia: http://www.regular-expressions.info/email.html

 4
Author: Mithon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 19:09:00

Adresy e-mail są niezwykle skomplikowane. Oto przykładowe Wyrażenie regularne, które będzie pasować do każdego poprawnego adresu RFC822: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

Zauważysz, że prawdopodobnie jest dłuższy niż reszta programu. Istnieją nawet całe moduły dla Perla w celu weryfikacji adresów e-mail. Więc prawdopodobnie nie dostaniesz niczego, co jest w 100% Idealne jako regex, a jednocześnie jest czytelne. Oto przykładowe zejście rekurencyjne parser: http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm

Ale musisz zdecydować, czy potrzebujesz doskonałego parsowania, czy prostego kodu.

 2
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 19:09:44
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()
 1
Author: nidhin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 17:15:45

Jeśli chcesz wyjąć pocztę z długiego łańcucha lub pliku, spróbuj tego.

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

Uwaga, będzie to działać, gdy masz miejsce przed i po adresie e-mail. jeśli nie masz spacji lub znaków specjalnych, Możesz spróbować ją zmodyfikować.

Przykład roboczy:

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

To usunie [email protected] z tego Sznurka.

Zwróć również uwagę, że może to nie być właściwa odpowiedź.. Ale umieściłem go tutaj, aby pomóc komuś, kto ma określone wymagania, takie jak me

 1
Author: Raj Chinna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-05 08:15:13

Powyższy parseaddr zignorowałby @.

from email.utils import parseaddr
parseaddr('aaa@[email protected]') ('', 'aaa@bbb')

Prawdopodobnie wyodrębnić adres i porównać z oryginałem?

Czy ktoś próbował zweryfikować.e-mail ?

 1
Author: Serge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 20:46:58
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

Zobacz validate_email docs .

 1
Author: ali.etemadi77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 20:18:54

Znajdowanie identyfikatora e-mail: wyszukiwanie zrzutu ekranu IP

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
Author: Mani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 11:04:04

Do sprawdzania wiadomości e-mail Użyj 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")
 0
Author: Vladislav Koshenevskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 20:45:32

Uznało to za praktyczną realizację:

[^@\s]+@[^@\s]+\.[^@\s]+
 0
Author: juan Isaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-12 02:28:10
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
 -1
Author: Anu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 13:39:51

Email validation

import re
def validate(email): 
    match=re.search(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9]+\.[a-zA-Z0-9.]*\.*[com|org|edu]{3}$)",email)
    if match:
        return 'Valid email.'
    else:
        return 'Invalid email.'
 -1
Author: Gaurav Nagpure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 12:19:52

Jedynym tak naprawdÄ™ dokÅ‚adnym sposobem odróżnienia prawdziwych, poprawnych adresów e-mail od nieprawidÅ‚owych jest wysÅ‚anie do niego poczty . To, co liczy siÄ™ jako e-mail, jest zaskakujÄ…co zawiÅ‚e ("John Doe" <[email protected]>" w rzeczywistoÅ›ci jest prawidÅ‚owym adresem e-mail) i najprawdopodobniej chcesz, aby adres e-mail faktycznie wysyÅ‚aÅ‚ na niego pocztÄ™ później. Po przejÅ›ciu kilku podstawowych kontroli rozsÄ…dku (takich jak w odpowiedzi Thomasa, ma @ i co najmniej jeden . po @), powinieneÅ› prawdopodobnie wysÅ‚ać list weryfikacyjny e-mail do adres i poczekaj, aż użytkownik podąży za linkiem osadzonym w wiadomoÅ›ci, aby potwierdzić, że wiadomość e-mail byÅ‚a prawidÅ‚owa.

 -2
Author: SingleNegationElimination,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-05 19:28:02