Verificar em Python o endereço de E-mail válido?

Existe uma boa maneira de verificar uma entrada de formulário usando a regex para se certificar de que é um endereço de E-mail de estilo apropriado? Tenho procurado desde ontem à noite e toda a gente que respondeu às perguntas das pessoas sobre este tópico também parece ter problemas com ele se for um endereço de email subdominado.

Author: user1937198, 2011-11-05

18 answers

Não vale a pena. Mesmo que você possa verificar que o endereço de E-mail é sintaticamente válido, Você ainda vai precisar verificar que ele não foi erradamente digitado, e que ele realmente vai para a pessoa que você acha que ele faz. A única maneira de fazer isso é enviar-lhes um e-mail e fazê-los clicar em um link para verificar. Portanto, uma verificação mais básica (por exemplo, que eles não entraram acidentalmente no seu endereço de rua) é geralmente suficiente. Algo como: tem exatamente um sinal @, e pelo menos um . na parte após a @:
[^@]+@[^@]+\.[^@]+

Você provavelmente também gostaria de desautorizar espaços em branco -- provavelmente existem endereços de E-mail válidos com espaços em branco neles, mas eu nunca vi nenhum, então as chances de ser um erro do usuário estão do seu lado.

Se quer a verificação completa, dê uma vista de olhos a esta pergunta.


Actualização: aqui está a forma como pode usar qualquer regex:

import re

if not re.match(r"... regex here ...", email):
  # whatever

Observe o r na frente da corda; desta forma, você não vai precisar escapar das coisas duplamente.

Se tiver um grande número de regexos para verificar, poderá ser mais rápido compilar o regex primeiro:

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever

Outra opção é usar o validate_email pacote, que realmente contacta o servidor SMTP para verificar se o endereço existe. Isto ainda não garante que pertence à pessoa certa.

 203
Author: Thomas, 2018-09-14 10:35:58

A biblioteca padrão Python vem com uma função de processamento de E-mail: email.utils.parseaddr().

Devolve uma dupla-tupla contendo o nome verdadeiro e as partes do endereço actual do 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]')

E se a análise não for bem sucedida, devolve uma dupla-tupla de cadeias de caracteres vazias:

>>> parseaddr('[invalid!email]')
('', '')

Um problema com este analisador é que ele está aceitando qualquer coisa que é considerado como um endereço de E-mail válido para RFC-822 e amigos, incluindo muitas coisas que claramente não são endereço na Internet:

>>> parseaddr('invalid@example,com') # notice the comma
('', 'invalid@example')

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

Assim, como @TokenMacGuy disse, a única forma definitiva de verificar um endereço de E-mail é enviar um e-mail para o endereço esperado e esperar que o utilizador actue sobre a informação dentro da mensagem.

No entanto, você pode querer verificar, pelo menos, a presença de um @ - sign no segundo elemento tuple, como @bvukelic sugere:

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

Se quiser ir mais longe, pode instalar o projectodnspython e resolver os servidores de E-mail para o domínio de E-mail (a parte a seguir ao '@'), só tentando enviar um e-mail se existirem servidores reais 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

Podes apanhar ambos NoAnswer e NXDOMAIN capturando dns.exception.DNSException.

E sim, foo@[email protected] é um endereço sintaticamente válido. Apenas o último @ deve ser considerado para detectar onde a parte do domínio começa.

 92
Author: LeoRochael, 2018-06-27 18:45:31
Ainda não vi a resposta entre a confusão de respostas regulares personalizadas, mas ... ..

O Python tem um módulo chamado validate_ email que tem 3 níveis de validação de E-mail, incluindo perguntar a um servidor SMTP válido se o endereço de E-mail é válido (sem enviar um e-mail).

Verificar o texto de E-mail é um formato válido:

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

Verifique se a máquina tem um servidor de SMTP:

is_valid = validate_email('[email protected]',check_mx=True)

Verifique se a máquina tem o servidor de SMTP e o e-mail realmente existe:

is_valid = validate_email('[email protected]',verify=True)

Para os interessados nos detalhes sujos, validate_email.py (fonte ) pretende ser fiel a RFC 2822.

Tudo o que estamos a fazer é comparar o texto de entrada com um uma expressão regular gigantesca. Mas construir aquele "regexp", e garantir a sua correcção, é facilitado pela sua montagem a partir dos" tokens " definidos pela RFC. Cada um destes símbolos é ensaiado no ensaio da unidade de acompanhamento arquivo.


Para instalar com o pip

pip install validate_email

E vai precisar do módulo pyDNS para verificar os servidores de SMTP

pip install pyDNS

Ou do Ubuntu

apt-get python3-dns
 39
Author: philshem, 2018-09-14 08:57:44
Os endereços de E-mail não são tão simples como parecem! Por exemplo, Bob_o'[email protected], é um endereço de E-mail válido. Tive sorte com o pacote lepl. http://www.acooke.org/lepl/). pode validar endereços de E-mail como indicado na RFC 3696: http://www.faqs.org/rfcs/rfc3696.html

Encontrei um código antigo:

import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()
if not email_validator("[email protected]"):
    print "Invalid email"
 22
Author: bigendian, 2013-05-27 15:22:55

Encontrei uma excelente (e testada) forma de verificar o endereço de E-mail válido. Eu colo o meu código aqui:

# 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)
 5
Author: James The Beard, 2016-12-06 11:26:48
Vejo muitas respostas complicadas aqui. Alguns deles, falham no conhecimento simples, verdadeiro endereço de E-mail, ou têm falsos positivos. Abaixo, é a maneira mais simples de testar que a string seria um e-mail válido. Ele testa contra 2 e 3 letras TLD. agora que você tecnicamente pode ter maiores, você pode querer aumentar os 3 para 4, 5 ou até 10.
import re
def valid_email(email):
  return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email))
 5
Author: PyTis, 2017-05-12 12:23:32

Isto é normalmente resolvido usando a expressão regular. No entanto, existem muitas variações de soluções. Dependendo de quão rigoroso você precisa ser, e se você tem requisitos personalizados para validação, ou irá aceitar qualquer endereço de E-mail válido.

Ver esta página, para referência: http://www.regular-expressions.info/email.html

 4
Author: Mithon, 2011-11-05 19:09:00
Os endereços de E-mail são incrivelmente complicados. Aqui está uma amostra que irá corresponder a cada endereço válido RFC822: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html Vais reparar que deve ser mais longo do que o resto do teu programa. Existem ainda módulos completos para Perl com o propósito de validar endereços de E-mail. Então, provavelmente não vais ter nada que seja 100% perfeito como um "regex", enquanto também podes ler. Aqui está uma amostra de descida recursiva analisador: http://cpansearch.perl.org/src/ABIGAIL/RFC-RFC822-Address-2009110702/lib/RFC/RFC822/Address.pm Mas terá de decidir se precisa de análise perfeita ou de um código simples.
 2
Author: Dan, 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()
 1
Author: nidhin, 2014-08-13 17:15:45

Se quiser tirar o correio de um texto longo ou ficheiro, então tente isto.

([^@|\s]+@[^@]+\.[^@|\s]+)
Nota, Isto irá funcionar quando tiver um espaço antes e depois do seu endereço de E-mail. se você não tem espaço ou tem alguns caracteres especiais, então você pode tentar modificá-lo.

Exemplo de trabalho:

string="Hello ABCD, here is my mail id [email protected] "
res = re.search("([^@|\s]+@[^@]+\.[^@|\s]+)",string,re.I)
res.group(1)
Isto vai acabar. [email protected] desta corda. Além disso, note que esta pode não ser a resposta certa.. Mas eu postei aqui para ajudar alguém que tem requisitos específicos como eu.
 1
Author: Raj Chinna, 2014-11-05 08:15:13

O parseaddr acima mencionado ignoraria o rasto @.

from email.utils import parseaddr
parseaddr('aaa@[email protected]') ('', 'aaa@bbb')
{[[2]} provavelmente extrair o endereço e comparar com o original? Alguém tentou validar.e-mail ?
 1
Author: Serge, 2016-02-08 20:46:58
import validator
is_valid = validate_email('[email protected]',verify=True)
if (is_valid==True):
    return 1
else:
    return 0

Ver validate_email docs .

 1
Author: ali.etemadi77, 2018-03-25 20:18:54

A procurar o ID de E-mail: 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..
 0
Author: Mani, 2017-08-23 11:04:04

Para verificar o e-mail use 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")
 0
Author: Vladislav Koshenevskiy, 2018-01-10 20:45:32

Considerei isto uma aplicação prática:

[^@\s]+@[^@\s]+\.[^@\s]+
 0
Author: juan Isaza, 2018-09-12 02:28:10
"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$"
 -1
Author: Anu, 2015-02-13 13:39:51

Validação por e-mail

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.'
 -1
Author: Gaurav Nagpure, 2016-10-21 12:19:52

A única maneira realmente precisa de distinguir os endereços de E-mail válidos dos Inválidos é para enviar e-mail para ele. O que conta como um e-mail é surpreendentemente complicado ({[[0]} na verdade é um endereço de E-mail válido), e você provavelmente quer que o endereço de E-mail realmente envie para ele mais tarde. Depois de passar algumas verificações básicas de sanidade (como na resposta de Thomas, tem um @ e pelo menos um . após o @), você provavelmente deveria enviar uma carta de verificação por e-mail para o endereço, e esperar que o usuário siga um link incorporado na mensagem para confirmar que o e-mail era válido.

 -2
Author: SingleNegationElimination, 2011-11-05 19:28:02