¿Qué está utilizando para validar las direcciones de correo electrónico de los usuarios y por qué?
Había estado usando validates_email_veracity_of
que en realidad consulta los servidores MX. Pero eso está lleno de fallas por varias razones, principalmente relacionadas con el tráfico y la confiabilidad de la red.
Miré a mi alrededor y no pude encontrar nada obvio que muchas personas estén usando para realizar una verificación de cordura en una dirección de correo electrónico. ¿Existe un complemento o gema mantenido y razonablemente preciso para esto?
PD: Por favor, no me diga que envíe un correo electrónico con un enlace para ver si el correo electrónico funciona. Estoy desarrollando una función "enviar a un amigo", por lo que esto no es práctico.
fuente
Respuestas:
Con Rails 3.0, puede usar una validación de correo electrónico sin expresiones regulares usando la gema Mail .
Aquí está mi implementación ( empaquetada como una joya ).
fuente
###@domain.com
va a validar?No hagas esto más difícil de lo necesario. Su función no es crítica; la validación es solo un paso básico de cordura para detectar errores tipográficos. Lo haría con una simple expresión regular y no desperdiciaría los ciclos de la CPU en algo demasiado complicado:
Eso fue adaptado de http://www.regular-expressions.info/email.html , que debe leer si realmente desea conocer todas las compensaciones. Si desea una expresión regular más correcta y mucho más complicada totalmente compatible con RFC822, también está en esa página. Pero la cosa es esta: no tienes que hacerlo del todo bien.
Si la dirección pasa la validación, enviará un correo electrónico. Si el correo electrónico falla, recibirá un mensaje de error. En ese momento puede decirle al usuario "Lo siento, su amigo no recibió eso, ¿le gustaría volver a intentarlo?" o marcarlo para revisión manual, o simplemente ignorarlo, o lo que sea.
Estas son las mismas opciones que le tiene que tratar si la dirección hizo pasar la validación. Porque incluso si su validación es perfecta y obtiene una prueba absoluta de que la dirección existe, el envío aún podría fallar.
El costo de un falso positivo en la validación es bajo. El beneficio de una mejor validación también es bajo. Valide generosamente y preocúpese por los errores cuando ocurran.
fuente
Creé una joya para la validación de correo electrónico en Rails 3. Me sorprende un poco que Rails no incluya algo como esto por defecto.
http://github.com/balexand/email_validator
fuente
if
ounless
? La documentación parece escasa.Este proyecto parece tener la mayor cantidad de observadores en github en este momento (para la validación de correo electrónico en rieles):
https://github.com/alexdunae/validates_email_format_of
fuente
De los documentos de Rails 4 :
fuente
En Rails 4 simplemente agregue
validates :email, email:true
(asumiendo que se llama su campoemail
) a su modelo y luego escriba un simple (o complejo †)EmailValidator
que se adapte a sus necesidades.por ejemplo: - su modelo:
Tu validador (entra
app/validators/email_validator.rb
)Esto permitirá todo tipo de correos electrónicos válidos, incluidos los correos electrónicos etiquetados como "[email protected]" y así sucesivamente.
Para probar esto
rspec
en tuspec/validators/email_validator_spec.rb
Así es como lo he hecho de todos modos. YMMV
† Las expresiones regulares son como violencia; si no funcionan, no está utilizando suficientes.
fuente
Como sugiere Hallelujah , creo que usar la gema Mail es un buen enfoque. Sin embargo, no me gustan algunos de los aros allí.
Yo suelo:
Podría ser más estricto exigiendo que los TLD (dominios de nivel superior) estén en esta lista ; sin embargo, se verá obligado a actualizar esa lista a medida que aparezcan nuevos TLD (como la adición de 2012
.mobi
y.tel
)La ventaja de conectar el analizador directamente es que las reglas de la gramática de Mail son bastante amplias para las partes que usa la gema de Mail, está diseñado para permitirle analizar una dirección como la
user<[email protected]>
que es común para SMTP. Al consumirlo delMail::Address
, se ve obligado a hacer un montón de controles adicionales.Otra nota con respecto a la gema Mail, aunque la clase se llama RFC2822, la gramática tiene algunos elementos de RFC5322 , por ejemplo esta prueba .
fuente
En Rails 3 es posible escribir un validador reutilizable , como explica esta gran publicación:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
y utilícelo con
validates_with
:fuente
Teniendo en cuenta las otras respuestas, la pregunta sigue siendo: ¿por qué molestarse en ser inteligente al respecto?
El volumen real de casos extremos que muchas expresiones regulares pueden negar o pasar por alto parece problemático.
Creo que la pregunta es '¿qué estoy tratando de lograr?', Incluso si 'valida' la dirección de correo electrónico, en realidad no está validando que sea una dirección de correo electrónico que funcione.
Si elige regexp, simplemente verifique la presencia de @ en el lado del cliente.
En cuanto al escenario de correo electrónico incorrecto, tiene una rama de 'error al enviar el mensaje' a su código.
fuente
Básicamente, existen 3 opciones más comunes:
Si no desea usar validates_email_veracity_of y token generation, optaría por la verificación de expresiones regulares de la vieja escuela.
fuente
La gema Mail tiene un analizador de direcciones integrado.
fuente
Esta solución se basa en las respuestas de @SFEley y @Alessandro DS, con una refactorización y aclaración de uso.
Puede usar esta clase de validación en su modelo así:
Dado que tiene lo siguiente en su
app/validators
carpeta (Rails 3):fuente
Para validación de listas de correo . (Yo uso Rails 4.1.6)
Obtuve mi expresión regular de aquí . Parece ser muy completo y ha sido probado con un gran número de combinaciones. Puedes ver los resultados en esa página.
Lo cambié ligeramente a una expresión regular de Ruby y lo puse en mi
lib/validators/email_list_validator.rb
Aquí está el código:
Y lo uso así en el modelo:
Validará listas de correo como esta, con diferentes separadores y sintetizadores:
Antes de usar esta expresión regular, usé
Devise.email_regexp
, pero esa es una expresión regular muy simple y no obtuve todos los casos que necesitaba. Algunos correos electrónicos saltaron.Probé otras expresiones regulares de la web, pero esta obtuvo los mejores resultados hasta ahora. Espero que te ayude en tu caso.
fuente