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 ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'awesome_print'
5
+ gem 'debugger'
6
+ end
7
+
8
+ group :test do
9
+ gem 'fakeweb', '>= 1.3'
10
+ gem 'rspec', '>= 2.14'
11
+ gem 'rspec-mocks', '>= 2.12.2'
12
+ end
13
+
14
+ gemspec
@@ -0,0 +1,10 @@
1
+ # MX Validator
2
+
3
+ Gem uses MX records to validate email addresses, no emails will be sent.
4
+
5
+ ## Usage
6
+
7
+ require 'mx-validator'
8
+ MX::Validator.validate('foo@gmail.com')
9
+
10
+ Have fun!
@@ -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,3 @@
1
+ class MxValidator
2
+ VERSION = "0.0.1"
3
+ end
@@ -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