Перевірка Python на дійсну адресу електронної пошти?

Чи є хороший спосіб перевірити введення форми за допомогою регулярного виразу, щоб переконатися, що це правильна адреса електронної пошти стилю? Був пошук з минулої ночі, і всі, хто відповів на запитання людей щодо цієї теми, також, схоже, мають проблеми з цим, якщо це адресний адреса електронної пошти.

Бессисленно. Навіть якщо ви можете перевірити, що адреса електронної пошти синтаксично дійсний, вам все одно потрібно буде перевірити, що це не було помилкою, і що він дійсно йде до людини, якого ви так думаєте. Єдиний спосіб зробити це - відправити їм електронного листа і натиснути на посилання для перевірки.

Тому, як правило, досить простої перевірки (наприклад, що вони випадково не ввійшли в свою адресу). Щось на кшталт: у нього є рівно один знак @ і принаймні один. в частині після @:

[^ @] + @ [^ @] + \. [^ @] +

Ймовірно, ви також захочете відхилити прогалини - в них, ймовірно, є допустимі адреси електронної пошти з пробілами, але я їх ніколи не бачив, тому ймовірність того, що це помилка користувача, на вашому боці.

Якщо вам потрібна повна перевірка, погляньте на це питання.

Оновлення. Ось як ви можете використовувати будь-яке таке регулярний вираз:

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

Стандартна бібліотека 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 (або цей для Python 3) і дозволити поштові сервери для домену електронної пошти (частина після «@»), тільки намагаючись відправити e -mail, якщо є реальні сервери MX:

>>> from dns.resolver import query >>> domain = 'foo @ bar @ 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.

І так, foo @ bar @ google.com - синтаксично дійсну адресу. Слід враховувати тільки останнє значення @ для визначення того, де починається домен.

Адреси електронної пошти не такі прості, як здається! Наприклад, 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"

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

У Python є модуль під назвою validate_email, який має 3 рівня перевірки достовірності електронної пошти, включаючи запит дійсного SMTP-сервера, якщо адреса електронної пошти дійсний (без відправки електронної пошти).

Перевірте правильність формату електронної пошти:

from validate_email import validate_email is_valid = validate_email ('[email protected] ')

Перевірте, чи має сервер SMTP-сервер:

is_valid = validate_email ( 'example @ example.com', check_mx = True)

Перевірте, чи є у хоста SMTP-сервер, і чи дійсно лист існує:

is_valid = validate_email ( 'example @ example.com', verify = True)

Для тих, хто цікавиться брудними деталями, validate_email.py (джерело) прагне бути вірним RFC 2822.

Все, що ми дійсно робимо, це порівняння вхідного рядка з одним гігантським регулярним виразом. Але створення цього регулярного виразу і забезпечення його правильності полегшується шляхом складання його з «токенов», визначених RFC. Кожен з цих токенов перевіряється в доданому файлі тестового файлу.

Щоб встановити за допомогою pip

pip install validate_email

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

pip install pyDNS

Зазвичай це вирішується за допомогою регулярного виразу. Однак існує безліч варіантів рішень. Залежно від того, наскільки строго ви повинні бути, і якщо у вас є призначені для користувача вимоги до валідації або приймаєте дійсну адресу електронної пошти.

Див. Цю сторінку для довідки: http://www.regular-expressions.info/email.html

Тут я бачу багато складних відповідей. Деякі з них, не знають простого, щирого адреси електронної пошти або мають помилкові спрацьовування. Нижче наведено найпростіший спосіб перевірки того, що рядок буде дійсною адресою електронної пошти. Він тестує 2 і 3 літери TLD. Тепер, коли ви технічно можете мати більші, ви можете збільшити 3 до 4, 5 або навіть 10.

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

Адреси електронної пошти неймовірно складні. Ось приклад регулярного виразу, який буде відповідати кожному дійсному адресою 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

але вам потрібно вирішити, чи потрібен вам ідеальний парсинг або простий код.

Я знайшов відмінний (і перевірений) спосіб перевірити дійсну адресу електронної пошти. Я вставляю свій код тут:

# 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) 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 @ bbb @ ccc.com') ( '', 'aaa @ bbb')

Можливо, витягнути адресу і порівняти з оригіналом?

Хто-небудь пробував перевірити.

Пошук ідентифікатора електронної пошти:

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 .. "^ [\ w \. \ + \ -] + \ @ [\ w] + \. [az] {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]> "дійсно є допустимим адресою електронної пошти), і ви, швидше за все, хочете, щоб адреса електронної пошти фактично відправив йому лист пізніше. деякі основні перевірки розсудливості (наприклад, у відповіді Томаса, мають @ і принаймні один. після @), ви, ймовірно, повинні просто відправити лист з підтвердженням електронної пошти на адресу і дочекатися, коли користувач виконає посилання, вбудовану в повідомлення щоб підтвердити , що лист дейст даткови.

  • Використання Python для видалення всіх рядків, відповідних Regex
  • Чи можу я мати НЕ-жадібне регулярний вираз з dotall?
  • Розбирайте оголошення javascript-об'єкта, яке не використовує рядка для імен властивостей (використовуючи python і BeautifulSoup)
  • словник для доступу до python з підстановочних знаками
  • Регулярний вираз для включення і виключення певних IP-адрес
  • Як перетворити регулярний вираз python в java
  • Патологічний регулярний вираз, яке вибухає (час і пам'ять)?
  • Відповідність рядка Python
  • regex для імені користувача Twitter
  • Django get url regex по імені
  • Розмітка пунктуації регулярних виразів
An?
Pattern = r "\"?
W +) \ "?