Saltar al contenido

¿Validación de correo electrónico en Ruby on Rails?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *