mx-validator 0.0.1
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.
- data/Gemfile +14 -0
- data/README.md +10 -0
- data/lib/mx-validator.rb +76 -0
- data/lib/mx-validator/version.rb +3 -0
- data/mx-validator.gemspec +25 -0
- data/spec/initial_spec.rb +54 -0
- metadata +84 -0
data/Gemfile
ADDED
data/README.md
ADDED
data/lib/mx-validator.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'net/telnet'
|
2
|
+
require 'dnsruby'
|
3
|
+
|
4
|
+
module MX
|
5
|
+
class Validator
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def validate(email)
|
10
|
+
# simple regex check
|
11
|
+
return false unless RegexValidator.validate(email)
|
12
|
+
|
13
|
+
# get list of smtp servers
|
14
|
+
smtp_server = Resolver.new(email).smtp_servers().first
|
15
|
+
|
16
|
+
# final validation
|
17
|
+
connect_to_smtp_validate(email, smtp_server)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def connect_to_smtp_validate(email, host)
|
23
|
+
server = Net::Telnet::new("Host" => host, "Timeout" => 100, "Port" => 25)
|
24
|
+
generated_dummy_mail = generate_dummy_username() + "@gmail.com"
|
25
|
+
|
26
|
+
commands = ["helo MX-VALIDATOR", "mail from:<#{generated_dummy_mail}>", "rcpt to:<#{email}>","quit" ]
|
27
|
+
commands.each do |command|
|
28
|
+
server.puts(command)
|
29
|
+
server.waitfor(/./) do |data|
|
30
|
+
return false if data =~ (/5\..?\..?/)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
|
37
|
+
def generate_dummy_username(size = 8)
|
38
|
+
charset = %w{ 2 3 4 6 7 8 9 A B C D E F G H J K M N P Q R T V W X Y Z}
|
39
|
+
(0...size).map{ charset.to_a[rand(charset.size)] }.join
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
class RegexValidator
|
47
|
+
|
48
|
+
UBER_RGX = /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i
|
49
|
+
|
50
|
+
def self.validate(email)
|
51
|
+
!!UBER_RGX.match(email)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class Resolver
|
57
|
+
include Dnsruby
|
58
|
+
|
59
|
+
SERVER_GREP = / (.*)\.?,/
|
60
|
+
|
61
|
+
def initialize(email)
|
62
|
+
@domain = email.split(/@/).last
|
63
|
+
@dns_resolver = Dnsruby::Resolver.new
|
64
|
+
end
|
65
|
+
|
66
|
+
def smtp_servers()
|
67
|
+
res = @dns_resolver.query(@domain, Types.MX)
|
68
|
+
results = res.answer
|
69
|
+
|
70
|
+
return results.collect do |r|
|
71
|
+
r.to_s.match(/ (.*)\.$/)[1]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib/', __FILE__)
|
3
|
+
$:.unshift lib unless $:.include?(lib)
|
4
|
+
require 'mx-validator/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
8
|
+
spec.authors = ['Haris Krajina']
|
9
|
+
spec.description = %q{MX validator is gem for verifying email addresses via MX records.}
|
10
|
+
spec.email = 'haris.krajina@gmail.com'
|
11
|
+
spec.files = %w(README.md Gemfile mx-validator.gemspec)
|
12
|
+
spec.files += Dir.glob("bin/**/*")
|
13
|
+
spec.files += Dir.glob("lib/**/*.rb")
|
14
|
+
spec.files += Dir.glob("spec/**/*")
|
15
|
+
spec.homepage = 'https://github.com/hkraji/mx-validator'
|
16
|
+
spec.licenses = ['MIT']
|
17
|
+
spec.name = 'mx-validator'
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
spec.required_rubygems_version = '>= 1.3.5'
|
20
|
+
spec.summary = spec.description
|
21
|
+
spec.test_files = Dir.glob("spec/**/*")
|
22
|
+
spec.version = MxValidator::VERSION
|
23
|
+
|
24
|
+
spec.add_dependency 'dnsruby', '>= 1.5.4'
|
25
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require_relative '../lib/mx-validator'
|
3
|
+
Bundler.require(:development, :test)
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
CORRECT_EMAIL_ADDRESS = %w{star.wars@yahoo.com star.wars@gmail.com star.wars@hotmail.com }
|
7
|
+
INCORRECT_EMAIL_ADDRESS = %w{test@domain.com23 a.33name.foo3bar.com foo[at]bar.com.net }
|
8
|
+
|
9
|
+
describe MX::RegexValidator do
|
10
|
+
describe '#validate' do
|
11
|
+
it "should validate correct email addresses" do
|
12
|
+
CORRECT_EMAIL_ADDRESS.each do |email|
|
13
|
+
MX::RegexValidator.validate(email).should eql true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should not validate incorrect email address" do
|
18
|
+
INCORRECT_EMAIL_ADDRESS.each do |email|
|
19
|
+
MX::RegexValidator.validate(email).should eql false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe MX::Resolver do
|
26
|
+
describe "#smpt_servers" do
|
27
|
+
it "should return array of available mx servers" do
|
28
|
+
CORRECT_EMAIL_ADDRESS.each do |email|
|
29
|
+
resolver = MX::Resolver.new(email)
|
30
|
+
resolver.smtp_servers().empty?.should eql false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe MX::Validator do
|
37
|
+
describe "#validate" do
|
38
|
+
it "should validate email addresses via MX records" do
|
39
|
+
CORRECT_EMAIL_ADDRESS.each do |email|
|
40
|
+
MX::Validator.validate(email).should eql true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should fail to validate email addresses via MX records" do
|
45
|
+
INCORRECT_EMAIL_ADDRESS.each do |email|
|
46
|
+
MX::Validator.validate(email).should eql false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mx-validator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Haris Krajina
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-08-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: dnsruby
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.5.4
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.5.4
|
46
|
+
description: MX validator is gem for verifying email addresses via MX records.
|
47
|
+
email: haris.krajina@gmail.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- README.md
|
53
|
+
- Gemfile
|
54
|
+
- mx-validator.gemspec
|
55
|
+
- lib/mx-validator.rb
|
56
|
+
- lib/mx-validator/version.rb
|
57
|
+
- spec/initial_spec.rb
|
58
|
+
homepage: https://github.com/hkraji/mx-validator
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 1.3.5
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.25
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: MX validator is gem for verifying email addresses via MX records.
|
83
|
+
test_files:
|
84
|
+
- spec/initial_spec.rb
|