Python проверяет действительный адрес электронной почты?
есть ли хороший способ проверить ввод формы с помощью регулярного выражения, чтобы убедиться, что это правильный адрес электронной почты стиля? Поиск с прошлой ночи, и все, кто ответил на вопросы людей по этой теме, также, похоже, имеют проблемы с ним, если это поддоменный адрес электронной почты.
18 ответов:
нет смысла. Даже если вы можете проверить, что адрес электронной почты синтаксически корректен, вам все равно нужно проверить, что он не был ошибочным, и что он действительно идет к человеку, которого вы думаете. Единственный способ сделать это-отправить им электронное письмо и заставить их щелкнуть ссылку для проверки.
поэтому, как правило, достаточно самой простой проверки (например, что они случайно не ввели свой адрес). Что-то вроде: он имеет ровно один
@знак, и хотя бы один.в части после@:[^@]+@[^@]+\.[^@]+вы, вероятно, также хотите запретить пробелы-вероятно, есть действительные адреса электронной почты с пробелами в них, но я никогда их не видел, поэтому вероятность того, что это ошибка пользователя, на вашей стороне.
если вы хотите полную проверку, посмотрите на этот вопрос.
обновление: вот как вы можете использовать любое такое регулярное выражение:
import re if not re.match(r"... regex here ...", email): # whateverПримечание
rперед строки; таким образом, вам не придется бежать дважды.если у вас есть большое количество регулярных выражений для проверки, это может быть быстрее, чтобы составить первое регулярное выражение:
import re EMAIL_REGEX = re.compile(r"... regex here ...") if not EMAIL_REGEX.match(email): # whatever
другой вариант-использовать
validate_emailпакет, который фактически связывается с SMTP-сервером, чтобы проверить, что адрес существует. Однако это все еще не гарантирует, что он принадлежит правильному человеку.
стандартная библиотека Python поставляется с функцией разбора электронной почты:
email.utils.parseaddr().он возвращает два кортежа, содержащие реальное имя и фактический адрес части электронной почты:
>>> 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]')и если синтаксический анализ не удался, он возвращает два кортежа пустых строк:
>>> parseaddr('[invalid!email]') ('', '')проблема с этим синтаксическим анализатором заключается в том, что он принимает все, что считается действительным адресом электронной почты для RFC-822 и друзей, включая многих вещи, которые явно не адресуются в широком Интернете:
>>> parseaddr('invalid@example,com') # notice the comma ('', 'invalid@example') >>> parseaddr('invalid-email') ('', 'invalid-email')Итак, как выразился @TokenMacGuy, единственный окончательный способ проверки адреса электронной почты-отправить электронное письмо на ожидаемый адрес и дождаться, пока пользователь будет действовать на информацию внутри сообщения.
однако вы можете проверить, по крайней мере, наличие знака @-на втором элементе кортежа, как предполагает @bvukelic:
>>> '@' in parseaddr("invalid-email")[1] Falseесли вы хотите сделать еще один шаг, вы можно установить dnspython проект и разрешить почтовые серверы для домена электронной почты (часть после'@'), только пытаясь отправить по электронной почте, если есть фактические
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вы можете поймать как
NoAnswerиNXDOMAIN, ловяdns.exception.DNSException.И Да
foo@[email protected]является синтаксически допустимым адресом. Только последний@следует рассмотреть для обнаружения, где начинается доменная часть.
Я не видел ответа уже здесь среди беспорядка пользовательских ответов регулярных выражений, но...
Python есть модуль под названием validate_email который имеет 3 уровня проверки электронной почты, включая запрос действительного SMTP-сервера, если адрес электронной почты действителен (без отправки электронной почты).
проверьте, что строка электронной почты имеет допустимый формат:
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 (источник) стремится быть верным RFC 2822.
все, что мы действительно делаем, это сравнение входной строки с одной гигантское регулярное выражение. Но построение этого регулярного выражения, и обеспечение его правильности, делается намного проще, собирая его из "токенов", определенных RFC. Каждый из этих маркеров проверено в прилагаемом файле модульного теста.
для установки с pip
pip install validate_emailи вам понадобится модуль pyDNS для проверки SMTP-серверов
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"
Я нашел отличный (и проверенный) способ проверить действительный адрес электронной почты. Я вставляю свой код здесь:
# 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)
Я вижу здесь много сложных ответов. Некоторые из них, не знают простой, истинный адрес электронной почты, или имеют ложные срабатывания. Ниже приведен самый простой способ проверки того, что строка будет действительной электронной почтой. Теперь, когда вы технически можете иметь более крупные, Вы можете увеличить 3 до 4, 5 или даже 10.
import re def valid_email(email): return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
Это обычно решается с помощью regex. Однако существует много вариантов решений. В зависимости от того, насколько строго вы должны быть, и если у вас есть специальные требования для проверки, либо принимает любой действительный адрес электронной почты.
см. эту страницу для справки:http://www.regular-expressions.info/email.html
адреса электронной почты невероятно сложны. Вот пример регулярного выражения, которое будет соответствовать каждому RFC822-действительный адрес: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
вы заметите, что это, вероятно, дольше, чем остальная часть вашей программы. Есть даже целые модули для Perl с целью проверки адреса электронной почты. Таким образом, вы, вероятно, не получите ничего, что на 100% идеально подходит в качестве регулярного выражения, а также читается. Вот пример рекурсивного спуска синтаксический анализатор: http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm
но вам нужно решить, нужен ли вам идеальный разбора или простой код.
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()
Если вы хотите, чтобы вынуть почту из длинной строки или файл, то попробуйте этот.
([^@|\s]+@[^@]+\.[^@|\s]+)Примечание, это будет работать, когда у вас есть пространство до и после вашего адреса электронной почты. если у вас нет места или есть некоторые специальные символы, то вы можете попробовать изменить его.
пример:
string="Hello ABCD, here is my mail id [email protected] " res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I) res.group(1)это будет вынимать [email protected] из этой строки.
кроме того, обратите внимание, что это может быть неправильный ответ.. Но я разместил его здесь, чтобы помочь кому-то, кто есть конкретные требования, как я
вышеупомянутый parseaddr будет игнорировать трейлинг @.
from email.utils import parseaddr parseaddr('aaa@[email protected]') ('', 'aaa@bbb')вероятно, извлечь адрес и сравнить с оригиналом?
кто-нибудь пробовал проверить.электронная почта ?
import validator is_valid = validate_email('[email protected]',verify=True) if (is_valid==True): return 1 else: return 0посмотреть validate_email docs.
Поиск 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..
для проверки электронной почты используйте 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")
письмо
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.'
единственный действительно точный способ отличить реальные, действительные адреса электронной почты от недействительных-это отправить ему почту. То, что считается электронной почтой, удивительно запутано (
"John Doe" <[email protected]>"на самом деле это действительный адрес электронной почты), и вы скорее всего хотите, чтобы адрес электронной почты, чтобы на самом деле отправить почту позже. После того, как он пройдет некоторые основные проверки здравомыслия (например, в ответе Томаса, имеет@и хотя бы один.после@), вы должны, вероятно, просто отправить по электронной почте письмо подтверждения на адрес, и ждать, пока пользователь перейдет по ссылке, встроенной в сообщение, чтобы подтвердить, что письмо было действительным.

Comments