[Cascavel-pm] Como validar um e-mail?

Adriano Ferreira a.r.ferreira em gmail.com
Sexta Maio 4 05:29:23 PDT 2007


Bem, não digam que o Luís Campos não avisou. A definição de um
endereço de e-mail está na RFC 2822, que é complexa. Ei, mas é
complexa mesmo! Entre as coisas permitidas estão comentários (como em
"(Luis (Motta (Campos)))" ) possivelmente aninhados. Isto faz com que
nenhuma expressão regular (pelo menos para Perl 5.8) seja suficiente.

O módulo Email::Address implementa o parsing de endereços de e-mail
segundo a RFC 2822. Um dos objetivos de projeto é ser rápido e
eficiente e então o número de níveis alinhados é fixo para uma
determinada chamada da rotina de parsing (para que possa ser feito com
regexes).

Abaixo a expressão regular completa aceitando 2 níveis de comentários aninhados:

$ perl -MEmail::Address -MData::Dump=dump -e 'print dump
$Email::Address::addr_spec'

qr/(?-xism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,."\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,."\s]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*"(?-xism:(?-xism:[^\\"])|(?-xism:\\(?-xism:[^\x0A\x0D])))+"(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*))\@(?-xism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,."\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,."\s]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*\[(?:\s*(?-xism:(?-xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D]))))*\s*\](?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|))*\s*\)\s*)))*\s*\)\s*)|\s+)*))/

Para saber mais sobre Email::Address, há sempre a documentação:

http://search.cpan.org/~rjbs/Email-Address-1.887/lib/Email/Address.pm

On 5/4/07, Cláudio <claudio em onerd.com.br> wrote:
> Tem um módulo que já verifica isso integralmente, chama-se: Mail::VRFY,
> veja exemplos em: http://search.cpan.org/~jkister/Mail-VRFY-0.56/VRFY.pm
>
> mas caro queira somente verifica o email, use o regex dessa função que é:
>
> if ($email =~
> /^(([a-z0-9_\.\+\-\=\?\^\#]){1,64})\@((([a-z0-9\-]){1,251}\.){1,252}[a-z0-9]{2,4})$/i)
> {
>     printf ("O email %s está correto\n",$email);
> } else {
>    printf ("O email %s é um email invalido\n",$email);
> }
>
> André Garcia Carneiro wrote:
> >> Então aceitando apenas:
> >> "@", "-", ".", "_", "+", letras e números (os demais não são necessários).
> >>
> >
> >
> >> O regex abaixo não funcionou (ou usei de forma errada)
> >> $email =~ /^[\._\w]+@[\._\w]+$/;
> >>
> >> Gostaria de fazer uma if, falando se tal $email é válido ou não...
> >>
> >
> > que tal
> >
> > if($email =~ /[\._\w]+@[\._\w]+$/){
> >         print 'Email valido!' ;
> > }
> > else
> > {
> >          print 'Email inválido!' ;
> > }
> >
> > Não me leve a mal, mas você não concorda que seria melhor você ler um pouco sobre perl(e talvez um pouco de
> > introdução a lógica de programação) ao invés de tentar aprender por 'osmose'?
> >
> > Sugestões:
> >
> > www.perl.org
> > www.perlmonks.org
> > www.cpan.org
> > www.perldoc.perl.org
> >
> > Livros de cabeceira...
> >
> > Programming Perl
> > Learning Perl
> > Perl Best Pratices
> >
> > Esses são só pra começar. Pode achar boa parte do conteúdo em http://books.google.com
> > Claro que os conteútdos não estão completos, isso seria contra a lei de direitos autorais. É só pra você
> > começar a se ambientar, e sentir vontade de comprar o livro.... :-D
> >
> >
> > Cheers!!!!
> >
> > --
> > André Garcia Carneiro
> > Developer(Perl/PHP)
> > Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
> >
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
> >
> >
>
>
> --
> Cláudio Borges
> <claudio[at]onerd.com.br>
> System Security Administrator
> Fone: +55 11 8261-7347
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>


Mais detalhes sobre a lista de discussão Cascavel-pm