Проверка Python на действительный адрес электронной почты?

Есть ли хороший способ проверить ввод формы с помощью regex, чтобы убедиться, что это правильный адрес электронной почты стиля? Был поиск с прошлой ночи, и все, кто ответил на вопросы людей по этой теме, также, похоже, имеют проблемы с этим, если это адресный адрес электронной почты.

Ответ 1

Нет смысла. Даже если вы можете проверить, что адрес электронной почты синтаксически действителен, вам все равно нужно будет проверить, что это не было ошибкой, и что он действительно идет к человеку, которого вы так думаете. Единственный способ сделать это - отправить им электронное письмо и нажать на ссылку для подтверждения.

Поэтому, как правило, достаточно простой проверки (например, что они случайно не вошли в свой адрес). Что-то вроде: он имеет ровно один знак @ и по крайней мере один . в части после @:

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

Вероятно, вы также захотите запретить пробелы - в них, вероятно, есть допустимые адреса электронной почты с пробелами, но я их никогда не видел, поэтому вероятность того, что это ошибка пользователя, на вашей стороне.

Если вам нужна полная проверка, посмотрите этот вопрос.


Обновление: здесь, как вы можете использовать любое такое регулярное выражение:

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

Ответ 2

Стандартная библиотека 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('[email protected],com') # notice the comma
('', '[email protected]')

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

Итак, как сказал @TokenMacGuy, единственным окончательным способом проверки адреса электронной почты является отправка электронной почты на ожидаемый адрес и ожидание, чтобы пользователь действовал на информацию внутри сообщения.

Тем не менее, вы можете проверить, по крайней мере, наличие @-сигнала для второго элемента кортежа, поскольку @bvukelic предлагает:

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

Если вы хотите сделать еще один шаг, вы можете установить dnspython проект (или этот для Python 3) и разрешить почтовые серверы для домена электронной почты (часть после "@" ), только пытаясь отправить электронное письмо, если есть фактические серверы MX:

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

Вы можете поймать оба NoAnswer и NXDOMAIN, поймав dns.exception.DNSException.

И да, [email protected]@google.com - синтаксически действительный адрес. Только последний @ должен быть рассмотрен для обнаружения, где начинается часть домена.

Ответ 3

Адреса электронной почты не так просты, как кажется! Например, 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"

Ответ 4

Я не видел ответа уже здесь среди беспорядка пользовательских ответов Regex, но...

У 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. Каждый из этих токенов в сопроводительном файле unit test.


Для установки с помощью pip

pip install validate_email

и вам понадобится модуль pyDNS для проверки SMTP-серверов

pip install pyDNS

Ответ 5

Это обычно решается с помощью регулярного выражения. Однако существует множество вариантов решений. В зависимости от того, насколько строго вы должны быть, и если у вас есть пользовательские требования к валидации или принимаете действительный адрес электронной почты.

См. эту страницу для справки: http://www.regular-expressions.info/email.html

Ответ 6

Адреса электронной почты невероятно сложны. Здесь примерное регулярное выражение, которое будет соответствовать каждому действительному адресу 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

но вам нужно решить, нужен ли вам идеальный парсинг или простой код.

Ответ 7

Я нашел отличный (и проверенный) способ проверить действительный адрес электронной почты. Я вставляю свой код здесь:

# 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

Здесь я вижу много сложных ответов. Некоторые из них, не знают простого, истинного адреса электронной почты или имеют ложные срабатывания. Ниже приведен самый простой способ проверки того, что строка будет действительным адресом электронной почты. Он тестирует 2 и 3 буквы TLD. Теперь, когда вы технически можете иметь более крупные, вы можете увеличить 3 до 4, 5 или даже 10.

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

Ответ 9

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

Ответ 10

Если вы хотите удалить почту из длинной строки или файла, попробуйте это.

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

Примечание. Это будет работать, если у вас есть место до и после вашего адреса электронной почты. если у вас нет места или у вас есть специальные символы, вы можете попробовать его изменить.

Рабочий пример:

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

Это выведет [email protected] из этой строки.

Кроме того, обратите внимание, что это может быть неправильным ответом. Но я разместил его здесь, чтобы помочь кому-то, у кого есть особые требования, такие как я

Ответ 11

Вышеупомянутый parseaddr будет игнорировать конечный @.

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

Возможно, извлеките адрес и сравните с оригиналом?

Кто-нибудь пробовал validate.email?

Ответ 12

Поиск идентификатора электронной почты: 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..

Ответ 13

"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"

Ответ 14

проверка подлинности электронной почты

import re
def validate(email): 
    match=re.search(r"(^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9]+\.[a-zA-Z0-9.]*\.*[com|org|edu]{3}$)",email)
    if match:
        return 'Valid email.'
    else:
        return 'Invalid email.'

Ответ 15

Единственный действительно точный способ отличить реальные, действительные адреса электронной почты от недействительных - это отправить ему письмо. То, что считается электронной почтой, удивительно запутано ("John Doe" <[email protected]>" действительно является допустимым адресом электронной почты), и вы, скорее всего, хотите, чтобы адрес электронной почты фактически отправил ему письмо позже. После прохождения некоторых основных проверок здравомыслия (например, в ответе Томаса есть @ и по крайней мере один . после @), вам, вероятно, следует просто отправить письмо с подтверждением электронной почты на адрес и дождаться чтобы следовать за ссылкой, встроенной в сообщение, чтобы подтвердить, что письмо действительно.