email_address 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'resolv'
4
- require 'netaddr'
5
- require 'socket'
3
+ require "resolv"
4
+ require "netaddr"
5
+ require "socket"
6
6
 
7
7
  module EmailAddress
8
8
  class Exchanger
9
9
  include Enumerable
10
10
 
11
- def self.cached(host, config={})
11
+ def self.cached(host, config = {})
12
12
  @host_cache ||= {}
13
- @cache_size ||= ENV['EMAIL_ADDRESS_CACHE_SIZE'].to_i || 100
13
+ @cache_size ||= ENV["EMAIL_ADDRESS_CACHE_SIZE"].to_i || 100
14
14
  if @host_cache.has_key?(host)
15
15
  o = @host_cache.delete(host)
16
16
  @host_cache[host] = o # LRU cache, move to end
@@ -22,14 +22,16 @@ module EmailAddress
22
22
  end
23
23
  end
24
24
 
25
- def initialize(host, config={})
25
+ def initialize(host, config = {})
26
26
  @host = host
27
27
  @config = config
28
+ @dns_disabled = @config[:host_validation] == :syntax || @config[:dns_lookup] == :off
28
29
  end
29
30
 
30
31
  def each(&block)
32
+ return if @dns_disabled
31
33
  mxers.each do |m|
32
- yield({host:m[0], ip:m[1], priority:m[2]})
34
+ yield({host: m[0], ip: m[1], priority: m[2]})
33
35
  end
34
36
  end
35
37
 
@@ -37,7 +39,7 @@ module EmailAddress
37
39
  def provider
38
40
  return @provider if defined? @provider
39
41
  EmailAddress::Config.providers.each do |provider, config|
40
- if config[:exchanger_match] && self.matches?(config[:exchanger_match])
42
+ if config[:exchanger_match] && matches?(config[:exchanger_match])
41
43
  return @provider = provider
42
44
  end
43
45
  end
@@ -50,40 +52,37 @@ module EmailAddress
50
52
  # may not find provider by MX name or IP. I'm not sure about the "0.0.0.0" ip, it should
51
53
  # be good in this context, but in "listen" context it means "all bound IP's"
52
54
  def mxers
53
- return [["example.com", "0.0.0.0", 1]] if @config[:dns_lookup] == :off
54
- @mxers ||= Resolv::DNS.open do |dns|
55
+ return [["example.com", "0.0.0.0", 1]] if @dns_disabled
56
+ @mxers ||= Resolv::DNS.open { |dns|
55
57
  dns.timeouts = @config[:dns_timeout] if @config[:dns_timeout]
56
58
 
57
59
  ress = begin
58
60
  dns.getresources(@host, Resolv::DNS::Resource::IN::MX)
59
- rescue Resolv::ResolvTimeout
60
- []
61
+ rescue Resolv::ResolvTimeout
62
+ []
61
63
  end
62
64
 
63
- records = ress.map do |r|
64
- begin
65
- if r.exchange.to_s > " "
66
- [r.exchange.to_s, IPSocket::getaddress(r.exchange.to_s), r.preference]
67
- else
68
- nil
69
- end
70
- rescue SocketError # not found, but could also mean network not work or it could mean one record doesn't resolve an address
71
- nil
65
+ records = ress.map { |r|
66
+ if r.exchange.to_s > " "
67
+ [r.exchange.to_s, IPSocket.getaddress(r.exchange.to_s), r.preference]
72
68
  end
73
- end
69
+ }
74
70
  records.compact
75
- end
71
+ }
72
+ # not found, but could also mean network not work or it could mean one record doesn't resolve an address
73
+ rescue SocketError
74
+ [["example.com", "0.0.0.0", 1]]
76
75
  end
77
76
 
78
77
  # Returns Array of domain names for the MX'ers, used to determine the Provider
79
78
  def domains
80
- @_domains ||= mxers.map {|m| EmailAddress::Host.new(m.first).domain_name }.sort.uniq
79
+ @_domains ||= mxers.map { |m| EmailAddress::Host.new(m.first).domain_name }.sort.uniq
81
80
  end
82
81
 
83
82
  # Returns an array of MX IP address (String) for the given email domain
84
83
  def mx_ips
85
- return ["0.0.0.0"] if @config[:dns_lookup] == :off
86
- mxers.map {|m| m[1] }
84
+ return ["0.0.0.0"] if @dns_disabled
85
+ mxers.map { |m| m[1] }
87
86
  end
88
87
 
89
88
  # Simple matcher, takes an array of CIDR addresses (ip/bits) and strings.
@@ -96,9 +95,9 @@ module EmailAddress
96
95
  rules = Array(rules)
97
96
  rules.each do |rule|
98
97
  if rule.include?("/")
99
- return rule if self.in_cidr?(rule)
98
+ return rule if in_cidr?(rule)
100
99
  else
101
- self.each {|mx| return rule if mx[:host].end_with?(rule) }
100
+ each { |mx| return rule if mx[:host].end_with?(rule) }
102
101
  end
103
102
  end
104
103
  false
@@ -1,8 +1,7 @@
1
-
2
- require 'simpleidn'
3
- require 'resolv'
4
- require 'netaddr'
5
- require 'net/smtp'
1
+ require "simpleidn"
2
+ require "resolv"
3
+ require "netaddr"
4
+ require "net/smtp"
6
5
 
7
6
  module EmailAddress
8
7
  ##############################################################################
@@ -34,12 +33,12 @@ module EmailAddress
34
33
  class Host
35
34
  attr_reader :host_name
36
35
  attr_accessor :dns_name, :domain_name, :registration_name,
37
- :tld, :tld2, :subdomains, :ip_address, :config, :provider,
38
- :comment, :error_message, :reason
36
+ :tld, :tld2, :subdomains, :ip_address, :config, :provider,
37
+ :comment, :error_message, :reason
39
38
  MAX_HOST_LENGTH = 255
40
39
 
41
40
  # Sometimes, you just need a Regexp...
42
- DNS_HOST_REGEX = / [\p{L}\p{N}]+ (?: (?: \-{1,2} | \.) [\p{L}\p{N}]+ )*/x
41
+ DNS_HOST_REGEX = / [\p{L}\p{N}]+ (?: (?: \-{1,2} | \.) [\p{L}\p{N}]+ )*/x
43
42
 
44
43
  # The IPv4 and IPv6 were lifted from Resolv::IPv?::Regex and tweaked to not
45
44
  # \A...\z anchor at the edges.
@@ -85,46 +84,45 @@ module EmailAddress
85
84
 
86
85
  # host name -
87
86
  # * host type - :email for an email host, :mx for exchanger host
88
- def initialize(host_name, config={})
89
- @original = host_name ||= ''
87
+ def initialize(host_name, config = {})
88
+ @original = host_name ||= ""
90
89
  config[:host_type] ||= :email
91
- @config = config
92
- @error = @error_message = nil
90
+ @config = config
91
+ @error = @error_message = nil
93
92
  parse(host_name)
94
93
  end
95
94
 
96
95
  # Returns the String representation of the host name (or IP)
97
96
  def name
98
- if self.ipv4?
99
- "[#{self.ip_address}]"
100
- elsif self.ipv6?
101
- "[IPv6:#{self.ip_address}]"
97
+ if ipv4?
98
+ "[#{ip_address}]"
99
+ elsif ipv6?
100
+ "[IPv6:#{ip_address}]"
102
101
  elsif @config[:host_encoding] && @config[:host_encoding] == :unicode
103
- ::SimpleIDN.to_unicode(self.host_name)
102
+ ::SimpleIDN.to_unicode(host_name)
104
103
  else
105
- self.dns_name
104
+ dns_name
106
105
  end
107
106
  end
108
- alias :to_s :name
107
+ alias to_s name
109
108
 
110
109
  # The canonical host name is the simplified, DNS host name
111
110
  def canonical
112
- self.dns_name
111
+ dns_name
113
112
  end
114
113
 
115
114
  # Returns the munged version of the name, replacing everything after the
116
115
  # initial two characters with "*****" or the configured "munge_string".
117
116
  def munge
118
- self.host_name.sub(/\A(.{1,2}).*/) { |m| $1 + @config[:munge_string] }
117
+ host_name.sub(/\A(.{1,2}).*/) { |m| $1 + @config[:munge_string] }
119
118
  end
120
119
 
121
120
  ############################################################################
122
121
  # Parsing
123
122
  ############################################################################
124
123
 
125
-
126
124
  def parse(host) # :nodoc:
127
- host = self.parse_comment(host)
125
+ host = parse_comment(host)
128
126
 
129
127
  if host =~ /\A\[IPv6:(.+)\]/i
130
128
  self.ip_address = $1
@@ -149,34 +147,34 @@ module EmailAddress
149
147
  name = fully_qualified_domain_name(name.downcase)
150
148
  @host_name = name
151
149
  if @config[:host_remove_spaces]
152
- @host_name = @host_name.gsub(' ', '')
150
+ @host_name = @host_name.delete(" ")
153
151
  end
154
- if host_name =~ /[^[:ascii:]]/
155
- @dns_name = ::SimpleIDN.to_ascii(self.host_name)
152
+ @dns_name = if /[^[:ascii:]]/.match?(host_name)
153
+ ::SimpleIDN.to_ascii(host_name)
156
154
  else
157
- @dns_name = self.host_name
155
+ host_name
158
156
  end
159
157
 
160
158
  # Subdomain only (root@localhost)
161
- if name.index('.').nil?
159
+ if name.index(".").nil?
162
160
  self.subdomains = name
163
161
 
164
162
  # Split sub.domain from .tld: *.com, *.xx.cc, *.cc
165
163
  elsif name =~ /\A(.+)\.(\w{3,10})\z/ ||
166
- name =~ /\A(.+)\.(\w{1,3}\.\w\w)\z/ ||
167
- name =~ /\A(.+)\.(\w\w)\z/
164
+ name =~ /\A(.+)\.(\w{1,3}\.\w\w)\z/ ||
165
+ name =~ /\A(.+)\.(\w\w)\z/
168
166
 
169
167
  sub_and_domain, self.tld2 = [$1, $2] # sub+domain, com || co.uk
170
- self.tld = self.tld2.sub(/\A.+\./, '') # co.uk => uk
168
+ self.tld = tld2.sub(/\A.+\./, "") # co.uk => uk
171
169
  if sub_and_domain =~ /\A(.+)\.(.+)\z/ # is subdomain? sub.example [.tld2]
172
- self.subdomains = $1
170
+ self.subdomains = $1
173
171
  self.registration_name = $2
174
172
  else
175
173
  self.registration_name = sub_and_domain
176
- #self.domain_name = sub_and_domain + '.' + self.tld2
174
+ # self.domain_name = sub_and_domain + '.' + self.tld2
177
175
  end
178
- self.domain_name = self.registration_name + '.' + self.tld2
179
- self.find_provider
176
+ self.domain_name = registration_name + "." + tld2
177
+ find_provider
180
178
  else # Bad format
181
179
  self.subdomains = self.tld = self.tld2 = ""
182
180
  self.domain_name = self.registration_name = name
@@ -187,7 +185,7 @@ module EmailAddress
187
185
  dn = @config[:address_fqdn_domain]
188
186
  if !dn
189
187
  if (host_part.nil? || host_part <= " ") && @config[:host_local]
190
- 'localhost'
188
+ "localhost"
191
189
  else
192
190
  host_part
193
191
  end
@@ -205,39 +203,39 @@ module EmailAddress
205
203
  return false unless registration_name
206
204
  find_provider
207
205
  return false unless config[:host_match]
208
- ! matches?(config[:host_match])
206
+ !matches?(config[:host_match])
209
207
  end
210
208
 
211
209
  def find_provider # :nodoc:
212
- return self.provider if self.provider
210
+ return provider if provider
213
211
 
214
212
  EmailAddress::Config.providers.each do |provider, config|
215
- if config[:host_match] && self.matches?(config[:host_match])
216
- return self.set_provider(provider, config)
213
+ if config[:host_match] && matches?(config[:host_match])
214
+ return set_provider(provider, config)
217
215
  end
218
216
  end
219
217
 
220
- return self.set_provider(:default) unless self.dns_enabled?
218
+ return set_provider(:default) unless dns_enabled?
221
219
 
222
- provider = self.exchangers.provider
220
+ provider = exchangers.provider
223
221
  if provider != :default
224
- self.set_provider(provider,
222
+ set_provider(provider,
225
223
  EmailAddress::Config.provider(provider))
226
224
  end
227
225
 
228
- self.provider ||= self.set_provider(:default)
226
+ self.provider ||= set_provider(:default)
229
227
  end
230
228
 
231
- def set_provider(name, provider_config={}) # :nodoc:
229
+ def set_provider(name, provider_config = {}) # :nodoc:
232
230
  self.config = EmailAddress::Config.all_settings(provider_config, @config)
233
231
  self.provider = name
234
232
  end
235
233
 
236
234
  # Returns a hash of the parts of the host name after parsing.
237
235
  def parts
238
- { host_name:self.host_name, dns_name:self.dns_name, subdomain:self.subdomains,
239
- registration_name:self.registration_name, domain_name:self.domain_name,
240
- tld2:self.tld2, tld:self.tld, ip_address:self.ip_address }
236
+ {host_name: host_name, dns_name: dns_name, subdomain: subdomains,
237
+ registration_name: registration_name, domain_name: domain_name,
238
+ tld2: tld2, tld: tld, ip_address: ip_address}
241
239
  end
242
240
 
243
241
  ############################################################################
@@ -246,19 +244,19 @@ module EmailAddress
246
244
 
247
245
  # Is this a fully-qualified domain name?
248
246
  def fqdn?
249
- self.tld ? true : false
247
+ tld ? true : false
250
248
  end
251
249
 
252
250
  def ip?
253
- self.ip_address.nil? ? false : true
251
+ ip_address.nil? ? false : true
254
252
  end
255
253
 
256
254
  def ipv4?
257
- self.ip? && self.ip_address.include?(".")
255
+ ip? && ip_address.include?(".")
258
256
  end
259
257
 
260
258
  def ipv6?
261
- self.ip? && self.ip_address.include?(":")
259
+ ip? && ip_address.include?(":")
262
260
  end
263
261
 
264
262
  ############################################################################
@@ -276,25 +274,25 @@ module EmailAddress
276
274
  rules = Array(rules)
277
275
  return false if rules.empty?
278
276
  rules.each do |rule|
279
- return rule if rule == self.domain_name || rule == self.dns_name
277
+ return rule if rule == domain_name || rule == dns_name
280
278
  return rule if registration_name_matches?(rule)
281
279
  return rule if tld_matches?(rule)
282
280
  return rule if domain_matches?(rule)
283
281
  return rule if self.provider && provider_matches?(rule)
284
- return rule if self.ip_matches?(rule)
282
+ return rule if ip_matches?(rule)
285
283
  end
286
284
  false
287
285
  end
288
286
 
289
287
  # Does "example." match any tld?
290
288
  def registration_name_matches?(rule)
291
- "#{self.registration_name}." == rule ? true : false
289
+ "#{registration_name}." == rule
292
290
  end
293
291
 
294
292
  # Does "sub.example.com" match ".com" and ".example.com" top level names?
295
293
  # Matches TLD (uk) or TLD2 (co.uk)
296
294
  def tld_matches?(rule)
297
- rule.match(/\A\.(.+)\z/) && ($1 == self.tld || $1 == self.tld2) ? true : false
295
+ rule.match(/\A\.(.+)\z/) && ($1 == tld || $1 == tld2) ? true : false
298
296
  end
299
297
 
300
298
  def provider_matches?(rule)
@@ -305,20 +303,20 @@ module EmailAddress
305
303
  # Requires optionally starts with a "@".
306
304
  def domain_matches?(rule)
307
305
  rule = $1 if rule =~ /\A@(.+)/
308
- return rule if File.fnmatch?(rule, self.domain_name) if self.domain_name
309
- return rule if File.fnmatch?(rule, self.dns_name) if self.dns_name
306
+ return rule if domain_name && File.fnmatch?(rule, domain_name)
307
+ return rule if dns_name && File.fnmatch?(rule, dns_name)
310
308
  false
311
309
  end
312
310
 
313
311
  # True if the host is an IP Address form, and that address matches
314
312
  # the passed CIDR string ("10.9.8.0/24" or "2001:..../64")
315
313
  def ip_matches?(cidr)
316
- return false unless self.ip_address
317
- return cidr if !cidr.include?("/") && cidr == self.ip_address
318
- if cidr.include?(":") && self.ip_address.include?(":")
319
- return cidr if NetAddr::IPv6Net.parse(cidr).contains(NetAddr::IPv6.parse(self.ip_address))
320
- elsif cidr.include?(".") && self.ip_address.include?(".")
321
- return cidr if NetAddr::IPv4Net.parse(cidr).contains(NetAddr::IPv4.parse(self.ip_address))
314
+ return false unless ip_address
315
+ return cidr if !cidr.include?("/") && cidr == ip_address
316
+ if cidr.include?(":") && ip_address.include?(":")
317
+ return cidr if NetAddr::IPv6Net.parse(cidr).contains(NetAddr::IPv6.parse(ip_address))
318
+ elsif cidr.include?(".") && ip_address.include?(".")
319
+ return cidr if NetAddr::IPv4Net.parse(cidr).contains(NetAddr::IPv4.parse(ip_address))
322
320
  end
323
321
  false
324
322
  end
@@ -329,13 +327,15 @@ module EmailAddress
329
327
 
330
328
  # True if the :dns_lookup setting is enabled
331
329
  def dns_enabled?
332
- [:mx, :a].include?(EmailAddress::Config.setting(:host_validation))
330
+ return false if @config[:dns_lookup] == :off
331
+ return false if @config[:host_validation] == :syntax
332
+ true
333
333
  end
334
334
 
335
335
  # Returns: [official_hostname, alias_hostnames, address_family, *address_list]
336
336
  def dns_a_record
337
337
  @_dns_a_record = "0.0.0.0" if @config[:dns_lookup] == :off
338
- @_dns_a_record ||= Socket.gethostbyname(self.dns_name)
338
+ @_dns_a_record ||= Socket.gethostbyname(dns_name)
339
339
  rescue SocketError # not found, but could also mean network not work
340
340
  @_dns_a_record ||= []
341
341
  end
@@ -343,19 +343,20 @@ module EmailAddress
343
343
  # Returns an array of EmailAddress::Exchanger hosts configured in DNS.
344
344
  # The array will be empty if none are configured.
345
345
  def exchangers
346
- #return nil if @config[:host_type] != :email || !self.dns_enabled?
347
- @_exchangers ||= EmailAddress::Exchanger.cached(self.dns_name, @config)
346
+ # return nil if @config[:host_type] != :email || !self.dns_enabled?
347
+ @_exchangers ||= EmailAddress::Exchanger.cached(dns_name, @config)
348
348
  end
349
349
 
350
350
  # Returns a DNS TXT Record
351
- def txt(alternate_host=nil)
351
+ def txt(alternate_host = nil)
352
+ return nil unless dns_enabled?
352
353
  Resolv::DNS.open do |dns|
353
354
  dns.timeouts = @config[:dns_timeout] if @config[:dns_timeout]
354
355
  records = begin
355
- dns.getresources(alternate_host || self.dns_name,
356
- Resolv::DNS::Resource::IN::TXT)
357
- rescue Resolv::ResolvTimeout
358
- []
356
+ dns.getresources(alternate_host || dns_name,
357
+ Resolv::DNS::Resource::IN::TXT)
358
+ rescue Resolv::ResolvTimeout
359
+ []
359
360
  end
360
361
 
361
362
  records.empty? ? nil : records.map(&:data).join(" ")
@@ -363,13 +364,13 @@ module EmailAddress
363
364
  end
364
365
 
365
366
  # Parses TXT record pairs into a hash
366
- def txt_hash(alternate_host=nil)
367
+ def txt_hash(alternate_host = nil)
367
368
  fields = {}
368
- record = self.txt(alternate_host)
369
+ record = txt(alternate_host)
369
370
  return fields unless record
370
371
 
371
372
  record.split(/\s*;\s*/).each do |pair|
372
- (n,v) = pair.split(/\s*=\s*/)
373
+ (n, v) = pair.split(/\s*=\s*/)
373
374
  fields[n.to_sym] = v
374
375
  end
375
376
  fields
@@ -378,7 +379,7 @@ module EmailAddress
378
379
  # Returns a hash of the domain's DMARC (https://en.wikipedia.org/wiki/DMARC)
379
380
  # settings.
380
381
  def dmarc
381
- self.dns_name ? self.txt_hash("_dmarc." + self.dns_name) : {}
382
+ dns_name ? txt_hash("_dmarc." + dns_name) : {}
382
383
  end
383
384
 
384
385
  ############################################################################
@@ -386,13 +387,13 @@ module EmailAddress
386
387
  ############################################################################
387
388
 
388
389
  # Returns true if the host name is valid according to the current configuration
389
- def valid?(rules={})
390
+ def valid?(rules = {})
390
391
  host_validation = rules[:host_validation] || @config[:host_validation] || :mx
391
- dns_lookup = rules[:dns_lookup] || host_validation
392
+ dns_lookup = rules[:dns_lookup] || host_validation
392
393
  self.error_message = nil
393
- if self.ip_address
394
+ if ip_address
394
395
  valid_ip?
395
- elsif ! valid_format?
396
+ elsif !valid_format?
396
397
  false
397
398
  elsif dns_lookup == :connect
398
399
  valid_mx? && connect
@@ -407,8 +408,9 @@ module EmailAddress
407
408
 
408
409
  # True if the host name has a DNS A Record
409
410
  def valid_dns?
411
+ return true unless dns_enabled?
410
412
  bool = dns_a_record.size > 0 || set_error(:domain_unknown)
411
- if self.localhost? && !@config[:host_local]
413
+ if localhost? && !@config[:host_local]
412
414
  bool = set_error(:domain_no_localhost)
413
415
  end
414
416
  bool
@@ -416,10 +418,11 @@ module EmailAddress
416
418
 
417
419
  # True if the host name has valid MX servers configured in DNS
418
420
  def valid_mx?
419
- if self.exchangers.nil?
421
+ return true unless dns_enabled?
422
+ if exchangers.nil?
420
423
  set_error(:domain_unknown)
421
- elsif self.exchangers.mx_ips.size > 0
422
- if self.localhost? && !@config[:host_local]
424
+ elsif exchangers.mx_ips.size > 0
425
+ if localhost? && !@config[:host_local]
423
426
  set_error(:domain_no_localhost)
424
427
  else
425
428
  true
@@ -433,9 +436,9 @@ module EmailAddress
433
436
 
434
437
  # True if the host_name passes Regular Expression match and size limits.
435
438
  def valid_format?
436
- if self.host_name =~ CANONICAL_HOST_REGEX && self.to_s.size <= MAX_HOST_LENGTH
439
+ if host_name =~ CANONICAL_HOST_REGEX && to_s.size <= MAX_HOST_LENGTH
437
440
  return true if localhost?
438
- return true if self.host_name.include?(".") # require FQDN
441
+ return true if host_name.include?(".") # require FQDN
439
442
  end
440
443
  set_error(:domain_invalid)
441
444
  end
@@ -444,12 +447,12 @@ module EmailAddress
444
447
  # is a potentially valid IP address. It does not check if the address
445
448
  # is reachable.
446
449
  def valid_ip?
447
- if ! @config[:host_allow_ip]
450
+ if !@config[:host_allow_ip]
448
451
  bool = set_error(:ip_address_forbidden)
449
- elsif self.ip_address.include?(":")
450
- bool = self.ip_address =~ Resolv::IPv6::Regex ? true : set_error(:ipv6_address_invalid)
451
- elsif self.ip_address.include?(".")
452
- bool = self.ip_address =~ Resolv::IPv4::Regex ? true : set_error(:ipv4_address_invalid)
452
+ elsif ip_address.include?(":")
453
+ bool = Resolv::IPv6::Regex.match?(ip_address) ? true : set_error(:ipv6_address_invalid)
454
+ elsif ip_address.include?(".")
455
+ bool = Resolv::IPv4::Regex.match?(ip_address) ? true : set_error(:ipv4_address_invalid)
453
456
  end
454
457
  if bool && (localhost? && !@config[:host_local])
455
458
  bool = set_error(:ip_address_no_localhost)
@@ -458,20 +461,20 @@ module EmailAddress
458
461
  end
459
462
 
460
463
  def localhost?
461
- if self.ip_address
464
+ if ip_address
462
465
  rel =
463
- if self.ip_address.include?(":")
464
- NetAddr::IPv6Net.parse(""+"::1").rel(
465
- NetAddr::IPv6Net.parse(self.ip_address)
466
+ if ip_address.include?(":")
467
+ NetAddr::IPv6Net.parse("" + "::1").rel(
468
+ NetAddr::IPv6Net.parse(ip_address)
466
469
  )
467
470
  else
468
- NetAddr::IPv4Net.parse(""+"127.0.0.0/8").rel(
469
- NetAddr::IPv4Net.parse(self.ip_address)
471
+ NetAddr::IPv4Net.parse("" + "127.0.0.0/8").rel(
472
+ NetAddr::IPv4Net.parse(ip_address)
470
473
  )
471
474
  end
472
475
  !rel.nil? && rel >= 0
473
476
  else
474
- self.host_name == 'localhost'
477
+ host_name == "localhost"
475
478
  end
476
479
  end
477
480
 
@@ -479,33 +482,30 @@ module EmailAddress
479
482
  # as an email address check, but is provided to assist in problem resolution.
480
483
  # If you abuse this, you *could* be blocked by the ESP.
481
484
  def connect
482
- begin
483
- smtp = Net::SMTP.new(self.host_name || self.ip_address)
484
- smtp.start(@config[:helo_name] || 'localhost')
485
+ smtp = Net::SMTP.new(host_name || ip_address)
486
+ smtp.start(@config[:helo_name] || "localhost")
487
+ smtp.finish
488
+ true
489
+ rescue Net::SMTPFatalError => e
490
+ set_error(:server_not_available, e.to_s)
491
+ rescue SocketError => e
492
+ set_error(:server_not_available, e.to_s)
493
+ ensure
494
+ if smtp&.started?
485
495
  smtp.finish
486
- true
487
- rescue Net::SMTPFatalError => e
488
- set_error(:server_not_available, e.to_s)
489
- rescue SocketError => e
490
- set_error(:server_not_available, e.to_s)
491
- ensure
492
- if smtp && smtp.started?
493
- smtp.finish
494
- end
495
496
  end
496
497
  end
497
498
 
498
- def set_error(err, reason=nil)
499
- @error = err
500
- @reason = reason
499
+ def set_error(err, reason = nil)
500
+ @error = err
501
+ @reason = reason
501
502
  @error_message = EmailAddress::Config.error_message(err)
502
503
  false
503
504
  end
504
505
 
505
506
  # The inverse of valid? -- Returns nil (falsey) if valid, otherwise error message
506
507
  def error
507
- self.valid? ? nil : @error_message
508
+ valid? ? nil : @error_message
508
509
  end
509
-
510
510
  end
511
511
  end