email-authentication 0.1.2 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -2
- data/bin/emailcheck.rb +4 -2
- data/lib/email-authentication/base.rb +55 -9
- data/test/coverage/index.html +1 -1
- data/test/test_address.rb +14 -7
- data/test/test_mx_records.rb +4 -7
- data/test/test_smtp.rb +29 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 111f33f51ed2cb1a269af68df394227ab7312dd9
|
4
|
+
data.tar.gz: 393f18a8d3b720f27baf9274451174d20d6ed355
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4543774e6ba679c5567013f9494c539087168e5322b999c6c40b7214b901e83b0f5bb0e934a09bf74f0a60ef43295328ea4e797de592b9c7541e3d5d25287fb9
|
7
|
+
data.tar.gz: a1f1376d98ec4a376c032a7fc3879463f5208eee2d73d1902994ba1abb3d41107c1532c9cacbf55feec016444eccd6d6b76fb41635d86f16e2c541e209ae9efe
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
email-authentication (0.1.
|
4
|
+
email-authentication (0.1.5)
|
5
5
|
dnsruby
|
6
6
|
|
7
7
|
GEM
|
@@ -11,7 +11,7 @@ GEM
|
|
11
11
|
simplecov (>= 0.7.1, < 1.0.0)
|
12
12
|
dnsruby (1.54)
|
13
13
|
minitest (5.0.8)
|
14
|
-
multi_json (1.8.
|
14
|
+
multi_json (1.8.2)
|
15
15
|
simplecov (0.7.1)
|
16
16
|
multi_json (~> 1.0)
|
17
17
|
simplecov-html (~> 0.7.1)
|
data/bin/emailcheck.rb
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'email-authentication'
|
4
4
|
# needs upgrade to thor
|
5
|
-
address
|
5
|
+
address = ARGV[0]
|
6
|
+
from=ARGV[1]
|
6
7
|
puts "Address is #{[address]}"
|
8
|
+
puts "From address #{from}"
|
7
9
|
@f=EmailAuthentication::Base.new
|
8
10
|
success,msg=@f.check(address)
|
9
|
-
puts "Success: #{address}" if success
|
11
|
+
puts "Success: #{address} messages #{msg}" if success
|
10
12
|
puts "Failure: #{address} messages: #{msg}" if !success
|
@@ -1,30 +1,34 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'dnsruby'
|
3
3
|
include Dnsruby
|
4
|
+
require 'net/telnet'
|
4
5
|
|
5
6
|
# Use the system configured nameservers to run a query
|
6
7
|
|
7
8
|
module EmailAuthentication
|
8
9
|
class Base
|
9
|
-
attr_accessor :address, :mx, :message, :domain
|
10
|
+
attr_accessor :address, :mx, :message, :domain, :from
|
10
11
|
def debug
|
11
12
|
true
|
12
13
|
end
|
13
|
-
def self.check(address)
|
14
|
+
def self.check(address,from)
|
14
15
|
tmp=self.new
|
15
|
-
return tmp.check(address)
|
16
|
+
return tmp.check(address,from)
|
16
17
|
end
|
17
|
-
def set_address(address)
|
18
|
+
def set_address(address,from="")
|
18
19
|
raise "address nil" if address==nil
|
19
20
|
raise "address blank" if address==""
|
21
|
+
raise "from address blank" if from==""
|
20
22
|
self.address=address.to_s
|
23
|
+
self.from=from
|
21
24
|
@flag=true
|
22
25
|
end
|
23
26
|
# this needs work. Anyone who can improve the regex i would be happy to put in their changes
|
27
|
+
# see alsothe validate_email_format gem for rails
|
24
28
|
def check_format
|
25
29
|
@@email_regex = /^(([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
|
26
30
|
res=(@address =~ @@email_regex)
|
27
|
-
puts " res is #{res}"
|
31
|
+
#puts " res is #{res}"
|
28
32
|
if res
|
29
33
|
[true,"format ok"]
|
30
34
|
else
|
@@ -40,13 +44,14 @@ module EmailAuthentication
|
|
40
44
|
def check_mx
|
41
45
|
domain=self.address.split('@')
|
42
46
|
@domain = domain[1]
|
43
|
-
puts "domain is #{domain}"
|
47
|
+
#puts "domain is #{domain}"
|
44
48
|
flag=false
|
45
49
|
if @domain!=nil
|
46
50
|
begin
|
47
51
|
ret = self.resolver.query(@domain, Types.MX)
|
48
52
|
if ret.answer!=nil and ret.rcode=='NOERROR'
|
49
53
|
@mx=ret.answer.first.exchange.to_s if ret.answer!=nil
|
54
|
+
@mx=@mx.downcase
|
50
55
|
msg= "mx record #{self.mx}"
|
51
56
|
puts msg
|
52
57
|
flag=true
|
@@ -63,12 +68,52 @@ module EmailAuthentication
|
|
63
68
|
[flag,msg]
|
64
69
|
end
|
65
70
|
# need to think about this and check the domain via telnet
|
71
|
+
#S: 220 smtp.example.com ESMTP Postfix
|
72
|
+
#C: HELO relay.example.org
|
73
|
+
#S: 250 Hello relay.example.org, I am glad to meet you
|
74
|
+
#C: MAIL FROM:<bob@example.org>
|
75
|
+
#S: 250 Ok
|
76
|
+
#C: RCPT TO:<alice@example.com>
|
77
|
+
#S: 250 Ok
|
78
|
+
|
66
79
|
def check_smtp
|
67
|
-
|
80
|
+
flag=false
|
81
|
+
msg='smtp ok'
|
82
|
+
domain=self.from.split('@')
|
83
|
+
@fromdomain = domain[1]
|
84
|
+
if @mx.include?('google') or @mx.include?('live.com')
|
85
|
+
flag=true
|
86
|
+
msg="smtp not checked since google or live: #{@mx}"
|
87
|
+
else
|
88
|
+
begin
|
89
|
+
smtp = Net::Telnet::new("Host" => @mx, 'Port' => 25, "Telnetmode" => false, "Prompt" => /^\+OK/)
|
90
|
+
c=""
|
91
|
+
msg=c
|
92
|
+
cmd="HELO " + @fromdomain
|
93
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/) { |c| print "CMD: #{cmd} RESP: #{c}"
|
94
|
+
msg << c}
|
95
|
+
cmd="MAIL FROM:<" +@from+ ">"
|
96
|
+
sleep 0.5
|
97
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/ ) { |c| print "CMD: #{cmd} RESP: #{c}"
|
98
|
+
msg << c}
|
99
|
+
cmd="RCPT TO:<" +@address+ ">"
|
100
|
+
sleep 0.5
|
101
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/ ) { |c| print "CMD: #{cmd} RESP: #{c}"
|
102
|
+
msg=c
|
103
|
+
flag=true if c.include?('250') }
|
104
|
+
cmd='quit'
|
105
|
+
smtp.cmd('String' => cmd, 'Match'=> /^221/ ) { |c| print "CMD: #{cmd} RESP: #{c}" }
|
106
|
+
rescue Exception => e
|
107
|
+
@flag=false
|
108
|
+
msg= "smtp exception #{e.message}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
[flag,msg]
|
68
113
|
end
|
69
114
|
# run all the checks
|
70
|
-
def check(address)
|
71
|
-
self.set_address(address)
|
115
|
+
def check(address,from)
|
116
|
+
self.set_address(address,from)
|
72
117
|
@message=[]
|
73
118
|
puts "checking #{@address}"
|
74
119
|
['format','mx','smtp'].each { |cmd|
|
@@ -76,6 +121,7 @@ module EmailAuthentication
|
|
76
121
|
res,msg= self.send(cmdstring)
|
77
122
|
@flag=@flag && res
|
78
123
|
@message << msg }
|
124
|
+
[@flag,@message.join(',').to_s]
|
79
125
|
end
|
80
126
|
|
81
127
|
|
data/test/coverage/index.html
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
<img src="./assets/0.7.1/loading.gif" alt="loading"/>
|
15
15
|
</div>
|
16
16
|
<div id="wrapper" style="display:none;">
|
17
|
-
<div class="timestamp">Generated <abbr class="timeago" title="2013-10-
|
17
|
+
<div class="timestamp">Generated <abbr class="timeago" title="2013-10-26T17:38:07+08:00">2013-10-26T17:38:07+08:00</abbr></div>
|
18
18
|
<ul class="group_tabs"></ul>
|
19
19
|
|
20
20
|
<div id="content">
|
data/test/test_address.rb
CHANGED
@@ -8,7 +8,7 @@ class EmailAuthenticationTest < Minitest::Test
|
|
8
8
|
@f=EmailAuthentication::Base.new
|
9
9
|
@success='scott.sproule@ficonab.com'
|
10
10
|
@failruntimeerror=[nil,""]
|
11
|
-
|
11
|
+
@from='scott.sproule@estormtech.com'
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_basic
|
@@ -18,21 +18,28 @@ class EmailAuthenticationTest < Minitest::Test
|
|
18
18
|
def test_checknil
|
19
19
|
|
20
20
|
assert_raises(RuntimeError) do
|
21
|
-
@f.check(nil)
|
21
|
+
@f.check(nil," ")
|
22
22
|
end
|
23
23
|
|
24
24
|
end
|
25
|
+
def test_checknil2
|
26
|
+
|
27
|
+
assert_raises(RuntimeError) do
|
28
|
+
@f.check("nil","")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
25
32
|
def test_checkfailruntime
|
26
33
|
@failruntimeerror.each { |add|
|
27
34
|
assert_raises(RuntimeError) do
|
28
|
-
@f.check(add)
|
35
|
+
@f.check(add,@from)
|
29
36
|
end
|
30
37
|
}
|
31
38
|
|
32
39
|
end
|
33
40
|
|
34
41
|
def test_goodemail
|
35
|
-
success,msg= @f.check(@success)
|
42
|
+
success,msg= @f.check(@success,@from)
|
36
43
|
assert success,"check did not succeed #{msg}"
|
37
44
|
end
|
38
45
|
def test_resolver_onlyonce
|
@@ -43,19 +50,19 @@ class EmailAuthenticationTest < Minitest::Test
|
|
43
50
|
end
|
44
51
|
#check a particular format
|
45
52
|
def test_checkformat_good
|
46
|
-
@f.set_address(@success)
|
53
|
+
@f.set_address(@success,@from)
|
47
54
|
success,msg= @f.check_format
|
48
55
|
assert success,"check did not succeed"
|
49
56
|
|
50
57
|
end
|
51
58
|
def test_class_variable
|
52
|
-
success,msg= EmailAuthentication::Base.check(@success)
|
59
|
+
success,msg= EmailAuthentication::Base.check(@success,@from)
|
53
60
|
assert success,"check did not succeed"
|
54
61
|
|
55
62
|
end
|
56
63
|
def test_bademails
|
57
64
|
['test','test#sed', 'test@jack'].each { |e|
|
58
|
-
@f.set_address(e)
|
65
|
+
@f.set_address(e,@from)
|
59
66
|
success,msg= @f.check_format
|
60
67
|
assert !success,"check did succeed but it should not for #{e}"
|
61
68
|
}
|
data/test/test_mx_records.rb
CHANGED
@@ -8,11 +8,12 @@ class EmailMXAuthenticationTest < Minitest::Test
|
|
8
8
|
@f=EmailAuthentication::Base.new
|
9
9
|
@success='scott.sproule@ficonab.com'
|
10
10
|
@failruntimeerror=[nil,""]
|
11
|
+
@from='scott.sproule@estormtech.com'
|
11
12
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_good_domain
|
15
|
-
@f.set_address(@success)
|
16
|
+
@f.set_address(@success,@from)
|
16
17
|
success,msg= @f.check_mx
|
17
18
|
assert success,"check did not succeed"
|
18
19
|
assert @f.mx!=nil, "mx should be set"
|
@@ -20,21 +21,17 @@ class EmailMXAuthenticationTest < Minitest::Test
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def test_bad_domain
|
23
|
-
@f.set_address('test@baddomainxx23345.com')
|
24
|
+
@f.set_address('test@baddomainxx23345.com',@from)
|
24
25
|
success,msg= @f.check_mx
|
25
26
|
assert !success,"check did not succeed"
|
26
27
|
|
27
28
|
end
|
28
29
|
def test_bad_domain2
|
29
|
-
@f.set_address('test@baddom ainxx23345.com')
|
30
|
+
@f.set_address('test@baddom ainxx23345.com',@from)
|
30
31
|
success,msg= @f.check_mx
|
31
32
|
assert !success,"check did not succeed"
|
32
33
|
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
36
|
|
40
37
|
end
|
data/test/test_smtp.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#uts File.dirname(__FILE__)
|
2
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class EmailSMTPAuthenticationTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@f=EmailAuthentication::Base.new
|
9
|
+
@success='scott.sproule@ficonab.com'
|
10
|
+
@failruntimeerror=[nil,""]
|
11
|
+
@from='scott.sproule@estormtech.com'
|
12
|
+
@success2='info2@paulaner.com.sg'
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_google_mx
|
16
|
+
@f.set_address(@success,@from)
|
17
|
+
success,msg= @f.check(@success,@from)
|
18
|
+
assert success,"check did not succeed"
|
19
|
+
puts msg
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_smtp_mx
|
23
|
+
success,msg= @f.check(@success2,@from)
|
24
|
+
assert success,"check did not succeed"
|
25
|
+
puts msg
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: email-authentication
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Sproule
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
12
|
-
dependencies:
|
11
|
+
date: 2013-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dnsruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: Try and authenticate email address, check format, lookup mx record and
|
14
28
|
check smtp connectivity
|
15
29
|
email: scott.sproule@ficonab.com
|
@@ -64,6 +78,7 @@ files:
|
|
64
78
|
- test/test_address.rb
|
65
79
|
- test/test_helper.rb
|
66
80
|
- test/test_mx_records.rb
|
81
|
+
- test/test_smtp.rb
|
67
82
|
- bin/emailcheck.rb
|
68
83
|
- Gemfile
|
69
84
|
- Gemfile.lock
|