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



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

824   18  

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

для проверки электронной почты используйте 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")

нашел, что это практическая реализация:

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

письмо

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

    Ничего не найдено.