O que você está usando para validar os endereços de e-mail dos usuários e por quê?
Eu estava usando o validates_email_veracity_of
que realmente consulta os servidores MX. Mas isso está cheio de falhas por vários motivos, principalmente relacionados ao tráfego de rede e à confiabilidade.
Olhei em volta e não consegui encontrar nada óbvio que muitas pessoas estão usando para realizar uma verificação de sanidade em um endereço de e-mail. Existe um plugin ou gem mantido e razoavelmente preciso para isso?
PS: Por favor, não me diga para enviar um e-mail com um link para ver se o e-mail funciona. Estou desenvolvendo um recurso "enviar para um amigo", então isso não é prático.
ruby-on-rails
validation
email
Luke Francl
fonte
fonte
Respostas:
Com Rails 3.0 você pode usar uma validação de email sem regexp usando a gem Mail .
Aqui está minha implementação ( empacotada como uma gema ).
fonte
###@domain.com
vai validar?Não torne isso mais difícil do que o necessário. Seu recurso não é crítico; a validação é apenas uma etapa de sanidade básica para detectar erros de digitação. Eu faria isso com um regex simples e não desperdiçaria os ciclos da CPU com nada muito complicado:
Isso foi adaptado de http://www.regular-expressions.info/email.html - que você deve ler se realmente quiser saber todas as vantagens e desvantagens. Se você deseja um regex totalmente compatível com RFC822 mais correto e muito mais complicado, isso também está nessa página. Mas a questão é a seguinte: você não precisa acertar totalmente.
Se o endereço passar na validação, você enviará um e-mail. Se o e-mail falhar, você receberá uma mensagem de erro. Nesse ponto, você pode dizer ao usuário "Desculpe, seu amigo não recebeu isso, gostaria de tentar novamente?" ou sinalize-o para revisão manual, ou simplesmente ignore-o, ou o que for.
Essas são as mesmas opções com as quais você teria que lidar se o endereço fosse aprovado na validação. Porque mesmo que sua validação seja perfeita e você adquira a prova absoluta de que o endereço existe, o envio pode falhar
O custo de um falso positivo na validação é baixo. O benefício de uma melhor validação também é baixo. Valide generosamente e se preocupe com os erros quando eles acontecerem.
fonte
Eu criei uma gem para validação de email no Rails 3. Estou meio surpreso que o Rails não inclua algo assim por padrão.
http://github.com/balexand/email_validator
fonte
if
ouunless
? A documentação parece esparsa.Este projeto parece ter a maioria dos observadores no github no momento (para validação de e-mail no rails):
https://github.com/alexdunae/validates_email_format_of
fonte
Dos documentos do Rails 4 :
fonte
No Rails 4, simplesmente adicione
validates :email, email:true
(assumindo que seu campo seja chamadoemail
) ao seu modelo e então escreva um † simples (ou complexo)EmailValidator
para atender às suas necessidades.por exemplo: - seu modelo:
Seu validador (entra
app/validators/email_validator.rb
)Isso permitirá todos os tipos de e-mails válidos, incluindo e-mails marcados como "[email protected]" e assim por diante.
Para testar isso
rspec
em seuspec/validators/email_validator_spec.rb
É assim que eu fiz de qualquer maneira. YMMV
† Expressões regulares são como violência; se eles não funcionarem, você não está usando o suficiente.
fonte
Como sugere Hallelujah , acho que usar a gema Mail é uma boa abordagem. No entanto, não gosto de alguns dos aros lá.
Eu uso:
Você poderia ser mais estrito exigindo que os TLDs (domínios de nível superior) estejam nesta lista ; no entanto, você seria forçado a atualizar essa lista à medida que novos TLDs surgissem (como a adição de 2012
.mobi
e.tel
)A vantagem de conectar o analisador direto é que as regras na gramática do Mail são bastante amplas para as partes que a gem do Mail usa, e é projetado para permitir que analise um endereço como o
user<[email protected]>
que é comum para SMTP. Ao consumi-lo do,Mail::Address
você é forçado a fazer várias verificações extras.Outra observação a respeito da gema Mail, embora a classe se chame RFC2822, a gramática possui alguns elementos da RFC5322 , por exemplo este teste .
fonte
No Rails 3 é possível escrever um validador reutilizável , como explica este ótimo post:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
e usá-lo com
validates_with
:fonte
Observando as outras respostas, a pergunta ainda permanece - por que se preocupar em ser inteligente sobre isso?
O volume real de casos extremos que muitos regex podem negar ou ignorar parece problemático.
Acho que a questão é 'o que estou tentando fazer?', Mesmo que você 'valide' o endereço de e-mail, na verdade não está validando se é um endereço de e-mail válido.
Se você for para regexp, apenas verifique a presença de @ no lado do cliente.
Quanto ao cenário de e-mail incorreto, tenha um branch 'mensagem falhou ao enviar' para o seu código.
fonte
Existem basicamente 3 opções mais comuns:
Se você não quiser usar validates_email_veracity_of e geração de token, eu escolheria a verificação de expressão regular da velha escola.
fonte
A gem Mail tem um analisador de endereços embutido.
fonte
Esta solução é baseada nas respostas de @SFEley e @Alessandro DS, com refatoração e esclarecimento de uso.
Você pode usar esta classe validadora em seu modelo da seguinte maneira:
Dado que você tem o seguinte em sua
app/validators
pasta (Rails 3):fonte
Para validação de listas de discussão . (Eu uso Rails 4.1.6)
Peguei meu regexp daqui . Parece ser muito completo e foi testado em um grande número de combinações. Você pode ver os resultados nessa página.
Eu mudei ligeiramente para uma regexp Ruby e coloquei no meu
lib/validators/email_list_validator.rb
Aqui está o código:
E eu uso assim no modelo:
Ele validará listas de e-mail como esta, com diferentes separadores e sintaxe:
Antes de usar esta regexp, eu usei
Devise.email_regexp
, mas é uma regexp muito simples e não obtive todos os casos que precisava. Alguns e-mails falharam.Tentei outras expressões regulares da web, mas esta obteve os melhores resultados até agora. Espero que ajude no seu caso.
fonte