Jak sprawdzić poprawny adres e-mail? [duplikat]
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.
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.
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.
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
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"
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)
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))
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
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 .
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.
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()
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
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}$"
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")
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 "
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:
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..
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]+
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.'
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.
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