Sha256: 7e31372161027cc62872cb1f1d29357849262c543c9cdeda51926383508a8acf

Contents?: true

Size: 848 Bytes

Versions: 1

Compression:

Stored size: 848 Bytes

Contents

# frozen_string_literal: true

require 'mail'
require 'resolv'

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    return if options[:allow_nil] && value.nil?
    return if options[:allow_blank] && value.blank?

    record.errors.add(attribute, :invalid, options) unless valid_format?(value) && valid_dns?(value)
  end

  protected

  def valid_format?(value)
    value =~ /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/i
  end

  def valid_dns?(value)
    begin
      mail = Mail::Address.new(value)
      isvalid = mail.domain && mail.address == value

      if isvalid
        mail_servers = Resolv::DNS.open.getresources(mail.domain, Resolv::DNS::Resource::IN::MX)
        isvalid = !mail_servers.empty?
      end
    rescue Exception => e
      isvalid = false
    end

    isvalid
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
translation_cms-0.1.5 app/validators/email_validator.rb