Jak sprawdzić poprawny adres e-mail? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak zweryfikować adres e-mail za pomocą wyrażenia regularnego? (76 odpowiedzi) Zamknięty 1 rok temu.

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: martineau, 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 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

Python ≥3,4 ma re.fullmatch który jest lepszy od re.match.

Uwaga r przed sznurkiem; w ten sposób nie będziesz musiał dwa razy uciekać.

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.

 288
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
2019-03-14 01:33:56

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.

 138
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
2019-03-13 20:25:34

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

Istnieje Biblioteka Pythona o nazwie py3-validate-email 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).

Aby zainstalować

python -m pip install py3-validate-email

Użycie podstawowe:

from validate_email import validate_email
is_valid = validate_email(email_address='[email protected]', \
    check_regex=True, check_mx=True, \
    from_address='[email protected]', helo_host='my.host.name', \ 
    smtp_timeout=10, dns_timeout=10, use_blacklist=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 testowane w załączonym pliku testowym jednostki.


możesz możesz potrzebujesz modułu pyDNS do sprawdzania serwerów SMTP

pip install pyDNS

Lub od Ubuntu

apt-get install python3-dns
 75
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
2020-10-25 08:42:52

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"
 23
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)
 14
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))
 10
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

 5
Author: Gaute Løken,
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
from validate_email import validate_email
is_valid = validate_email('[email protected]',verify=True)
print(bool(is_valid))

Zobacz validate_email docs .

 5
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
2020-08-24 14:54:49

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.

 4
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()
 4
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 Å‚aÅ„cucha.

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 konkretne wymagania, takie jak ja

 2
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
2020-01-03 16:55:49
"^[\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

Do sprawdzania użycia poczty e-mail 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")
 1
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
2019-02-08 08:41:42

Użyj tej maski filtra przy wprowadzaniu wiadomości e-mail: emailMask: /[\w.\-@'"!#$%&'*+/=?^_{|}~]/i "

 0
Author: Dilip Paudel,
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
2019-02-12 20:59:26

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

Uznało to za praktyczną realizację:

[^@\s]+@[^@\s]+\.[^@\s]+
 -1
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

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.'
 -3
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.

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