Esta sección ha sido evaluado por nuestros especialistas así garantizamos la veracidad de nuestro tutorial.
Solución:
Uso la constante integrada en URI en la biblioteca Ruby estándar
validates :email, format: with: URI::MailTo::EMAIL_REGEXP
Actualización: Acabo de encontrar la gema valid_email2 que se ve muy bien.
No utilice una expresión regular para la validación de direcciones de correo electrónico. Es una trampa. Hay muchos más formatos de dirección de correo electrónico válidos de los que imaginas. ¡Sin embargo! Él mail
gem (ActionMailer lo requiere, por lo que lo tiene) analizará las direcciones de correo electrónico, con un analizador adecuado, para usted:
require 'mail'
a = Mail::Address.new('[email protected]')
Esto arrojará un Mail::Field::ParseError
si es una dirección de correo electrónico no compatible. (No vamos a entrar en cosas como hacer una búsqueda de direcciones MX ni nada).
Si desea la buena experiencia del validador de Rails, puede hacer app/models/concerns/email_validatable.rb
:
require 'mail'
module EmailValidatable
extend ActiveSupport::Concern
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
begin
a = Mail::Address.new(value)
rescue Mail::Field::ParseError
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
end
y luego en su modelo, puede:
include EmailValidatable
validates :email, email: true
Como se menciona en el comentario de Iwo Dziechciarow a continuación, esto pasa cualquier cosa que sea una dirección "Para:" válida. Entonces algo como Foo Bar <[email protected]>
es válida. Esto puede ser un problema para ti, puede que no; Realmente es una dirección válida, después de todo.
Si desea solo la parte de la dirección:
a = Mail::Address.new('Foo Bar <[email protected]>')
a.address
=> "[email protected]"
Como Björn Weinbrenne señala a continuación, hay muchas más direcciones RFC2822 válidas de lo que puede esperar (estoy bastante seguro de que todas las direcciones enumeradas allí son compatibles y pueden recibir correo dependiendo de las configuraciones del sistema); es por eso que no recomiendo probar una expresión regular, pero usando un analizador compatible.
Si realmente le importa si puede enviar un correo electrónico a una dirección, entonces su mejor apuesta, por mucho, es enviar un mensaje con un enlace de verificación.
Si ya usa la gema Devise en su aplicación, podría ser oportuno usar
email =~ Devise.email_regexp
... lo que también significa que diferentes lugares de la aplicación usan la misma validación.
Comentarios y calificaciones
Si para ti ha resultado de ayuda este post, sería de mucha ayuda si lo compartieras con más desarrolladores de esta forma nos ayudas a difundir nuestro contenido.