Class: EmailAddress::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/email_address/validator.rb

Constant Summary collapse

LEGIBLE_LOCAL_REGEX =
/\A[a-z0-9]+(([\.\-\_\'\+][a-z0-9]+)+)?\z/
DOT_ATOM_REGEX =
/[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(address, options = {}) ⇒ Validator

Returns a new instance of Validator.



10
11
12
13
14
15
16
17
# File 'lib/email_address/validator.rb', line 10

def initialize(address, options={})
  @address = address
  @local   = address.local
  @host    = address.host
  @options = options
  @rules   = EmailAddress::Config.provider(@host.provider)
  @errors  = []
end

Class Method Details

.validate(address, options = {}) ⇒ Object



6
7
8
# File 'lib/email_address/validator.rb', line 6

def self.validate(address, options={})
  EmailAddress::Validator.new(address, options).valid?
end

Instance Method Details

#invalid(reason, *info) ⇒ Object



83
84
85
86
87
# File 'lib/email_address/validator.rb', line 83

def invalid(reason, *info)
  @errors << reason
  #p "INVALID ----> #{reason} for #{@local.to_s}@#{@host.to_s} #{info.inspect}"
  false
end

#legible?Boolean

Allows single, simple punctua3Nz=Xj/7c9 tion character between words

Returns:

  • (Boolean)


54
55
56
# File 'lib/email_address/validator.rb', line 54

def legible?
  @local.to_s =~ LEGIBLE_LOCAL_REGEX
end

#mailbox_validator(v) ⇒ Object



31
32
33
34
35
36
37
38
39
40
# File 'lib/email_address/validator.rb', line 31

def mailbox_validator(v)
  return true unless v
  if v.is_a?(Proc)
    return invalid(:mailbox_proc) unless @rules[:valid_mailbox].call(@local)
  elsif v == :legible
    return legible?
  elsif v == :rfc
    return rfc_compliant?
  end
end

#valid?Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
27
28
29
# File 'lib/email_address/validator.rb', line 19

def valid?
  return false unless valid_sizes?
  if @rules[:valid_mailbox] && ! @rules[:valid_mailbox].call(@local.to_s)
    #p ["VALIDATOR", @local.to_s, @rules[:valid_mailbox]]
    return invalid(:mailbox_validator)
  else
    return false unless valid_local?
  end
  return invalid(:mx) unless valid_mx? || (valid_dns? && @options[:allow_dns_a])
  true
end

#valid_dns?Boolean

True if the DNS A record or MX records are defined Why A record? Some domains are misconfigured with only the A record.

Returns:

  • (Boolean)


44
45
46
# File 'lib/email_address/validator.rb', line 44

def valid_dns?
  @host.exchanger.has_dns_a_record?
end

#valid_google_local?Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/email_address/validator.rb', line 89

def valid_google_local?
  true
end

#valid_local?Boolean

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
75
# File 'lib/email_address/validator.rb', line 66

def valid_local?
  return invalid(:mailbox) unless valid_local_part?(@local.mailbox)
  return invalid(:comment) unless @local.comment.empty? || valid_local_part?(@local.comment)
  if @local.tag
    @local.tag.split(@rules[:tag_separator]).each do |t|
      return invalid(:tag, t) unless valid_local_part?(t)
    end
  end
  true
end

#valid_local_part?(p) ⇒ Boolean

Valid within a mailbox, tag, comment

Returns:

  • (Boolean)


78
79
80
# File 'lib/email_address/validator.rb', line 78

def valid_local_part?(p)
  p =~ LEGIBLE_LOCAL_REGEX
end

#valid_mx?Boolean

True if the DNS MX records have been defined. More strict than #valid?

Returns:

  • (Boolean)


49
50
51
# File 'lib/email_address/validator.rb', line 49

def valid_mx?
  @host.exchanger.mxers.size > 0
end

#valid_sizes?Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
64
# File 'lib/email_address/validator.rb', line 58

def valid_sizes?
  return invalid(:address_size) unless @rules[:address_size].include?(@address.to_s.size)
  return invalid(:domain_size ) unless @rules[:domain_size ].include?(@host.to_s.size)
  return invalid(:local_size  ) unless @rules[:local_size  ].include?(@local.to_s.size)
  return invalid(:mailbox_size) unless @rules[:mailbox_size].include?(@local.mailbox.size)
  true
end