mail_address 1.1.0 → 1.1.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.
- checksums.yaml +4 -4
- data/lib/mail_address/address.rb +26 -31
- data/lib/mail_address/mail_address.rb +1 -1
- data/lib/mail_address/version.rb +1 -1
- data/spec/mail_address_spec.rb +37 -7
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6c3df155a843a41e44b3cd71ead006d7b8eec109
|
|
4
|
+
data.tar.gz: e4c5a5226870fe2a2c6c711f4702d036e18077b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 25b66af8271b90ac1bf4bb5578c1829639d8bc840b210223b50bb2f63d6981b92ff6ac0cc6bdf12fac0a03de22284551b917266e48475e02107f06587db0967f
|
|
7
|
+
data.tar.gz: 2f3a9775c6621af6a87e15f8c0c10ffee43843cec22d57418bca53304241c6ca9e4d6e8fa5195e8a13555727300958547277d2f8495e20955a70750904c15b78
|
data/lib/mail_address/address.rb
CHANGED
|
@@ -2,18 +2,31 @@ module MailAddress
|
|
|
2
2
|
|
|
3
3
|
class Address
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
attr_accessor :phrase, :address, :original
|
|
6
|
+
|
|
7
|
+
def initialize(phrase, address, original)
|
|
8
|
+
|
|
9
|
+
@address = address
|
|
6
10
|
@phrase = phrase
|
|
7
|
-
@address = address_
|
|
8
11
|
@original = original
|
|
12
|
+
|
|
13
|
+
### validate afterwords
|
|
14
|
+
# parse failed or invalid address
|
|
15
|
+
unless (@address && @original.include?(@address)) && Address._check_address_with_regex(@address)
|
|
16
|
+
@address = nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# invalid address
|
|
20
|
+
if @address.nil? && (phrase.nil? || phrase == "")
|
|
21
|
+
@phrase = original
|
|
22
|
+
end
|
|
9
23
|
end
|
|
10
|
-
attr_accessor :phrase, :original
|
|
11
24
|
|
|
12
25
|
ATEXT = '[\-\w !#$%&\'*+/=?^`{|}~]'
|
|
13
26
|
|
|
14
27
|
def format
|
|
15
28
|
addr = []
|
|
16
|
-
return @original if address.nil?
|
|
29
|
+
return @original if @address.nil?
|
|
17
30
|
|
|
18
31
|
if !@phrase.nil? && @phrase.length > 0 then
|
|
19
32
|
if @phrase.match(/\A\(/) && @phrase.match(/\)\z/)
|
|
@@ -35,43 +48,18 @@ module MailAddress
|
|
|
35
48
|
|
|
36
49
|
def name
|
|
37
50
|
phrase = @phrase.dup
|
|
38
|
-
addr = @address ? @address.dup : ""
|
|
39
|
-
|
|
40
51
|
name = Address._extract_name(phrase)
|
|
41
|
-
|
|
42
|
-
# first.last@domain address
|
|
43
|
-
if (name == '') && (md = addr.match(/([^\%\.\@_]+([\._][^\%\.\@_]+)+)[\@\%]/)) then
|
|
44
|
-
name = md[1]
|
|
45
|
-
name.gsub!(/[\._]+/, ' ')
|
|
46
|
-
name = Address._extract_name name
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
if (name == '' && addr.match(%r{/g=}i)) then # X400 style address
|
|
50
|
-
f = addr.match(%r{g=([^/]*)}i)
|
|
51
|
-
l = addr.match(%r{s=([^/]*)}i)
|
|
52
|
-
name = Address._extract_name "#{f[1]} #{l[1]}"
|
|
53
|
-
end
|
|
54
|
-
|
|
55
52
|
name.length > 0 ? name : nil
|
|
56
53
|
end
|
|
57
54
|
|
|
58
|
-
def address
|
|
59
|
-
# double check
|
|
60
|
-
if @address.nil? || @original.include?(@address)
|
|
61
|
-
@address
|
|
62
|
-
else
|
|
63
|
-
nil # wrongly constructed address
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
55
|
def host
|
|
68
|
-
addr = address || '';
|
|
56
|
+
addr = @address || '';
|
|
69
57
|
i = addr.rindex('@')
|
|
70
58
|
i.nil? ? nil : addr[i + 1 .. -1]
|
|
71
59
|
end
|
|
72
60
|
|
|
73
61
|
def user
|
|
74
|
-
addr = address || '';
|
|
62
|
+
addr = @address || '';
|
|
75
63
|
i = addr.rindex('@')
|
|
76
64
|
i.nil? ? addr : addr[0 ... i]
|
|
77
65
|
end
|
|
@@ -106,6 +94,13 @@ module MailAddress
|
|
|
106
94
|
name
|
|
107
95
|
end
|
|
108
96
|
|
|
97
|
+
# check if the address is compliant with RFC2822
|
|
98
|
+
def self._check_address_with_regex(email_address)
|
|
99
|
+
return nil unless email_address
|
|
100
|
+
# regex check (see http://blog.livedoor.jp/dankogai/archives/51189905.html)
|
|
101
|
+
email_address.match(/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$/)
|
|
102
|
+
end
|
|
103
|
+
|
|
109
104
|
end
|
|
110
105
|
|
|
111
106
|
end
|
|
@@ -10,7 +10,7 @@ module MailAddress
|
|
|
10
10
|
return [ MailAddress::Address.new(line, nil, line) ]
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
# obviously
|
|
13
|
+
# obviously all email address(es) are invalid
|
|
14
14
|
unless line.match(/[a-z0-9\.\-"_\+]@/i)
|
|
15
15
|
return [ MailAddress::Address.new(line, nil, line) ]
|
|
16
16
|
end
|
data/lib/mail_address/version.rb
CHANGED
data/spec/mail_address_spec.rb
CHANGED
|
@@ -170,7 +170,7 @@ describe MailAddress do
|
|
|
170
170
|
end
|
|
171
171
|
|
|
172
172
|
it "normal case (multiple address)" do
|
|
173
|
-
line = "John 'M' Doe <john@example.com>, 大阪 太郎 <osaka@example.jp
|
|
173
|
+
line = "John 'M' Doe <john@example.com>, 大阪 太郎 <osaka@example.jp>, localpartonly"
|
|
174
174
|
results = MailAddress.parse(line)
|
|
175
175
|
|
|
176
176
|
expect(results[0].format).to eq("John 'M' Doe <john@example.com>")
|
|
@@ -190,6 +190,14 @@ describe MailAddress do
|
|
|
190
190
|
expect(results[1].host).to eq("example.jp")
|
|
191
191
|
expect(results[1].user).to eq("osaka")
|
|
192
192
|
expect(results[1].original).to eq('大阪 太郎 <osaka@example.jp>')
|
|
193
|
+
|
|
194
|
+
expect(results[2].format).to eq("localpartonly")
|
|
195
|
+
expect(results[2].address).to be_nil
|
|
196
|
+
expect(results[2].name).to eq("localpartonly")
|
|
197
|
+
expect(results[2].phrase).to eq("localpartonly")
|
|
198
|
+
expect(results[2].host).to be_nil
|
|
199
|
+
expect(results[2].user).to eq("")
|
|
200
|
+
expect(results[2].original).to eq("localpartonly")
|
|
193
201
|
end
|
|
194
202
|
|
|
195
203
|
it "normal case (rfc-violated(RFC822) but commonly used in AU/DoCoMo)" do
|
|
@@ -359,6 +367,28 @@ describe MailAddress do
|
|
|
359
367
|
expect(results[0].original).to eq('') # Note that it returns empty string NOT nil
|
|
360
368
|
end
|
|
361
369
|
|
|
370
|
+
it "suppress too much extraction" do
|
|
371
|
+
line = 'john_doe@example.com'
|
|
372
|
+
results = MailAddress.parse(line)
|
|
373
|
+
expect(results[0].format).to eq('john_doe@example.com')
|
|
374
|
+
expect(results[0].address).to eq('john_doe@example.com')
|
|
375
|
+
expect(results[0].name).to be_nil
|
|
376
|
+
expect(results[0].phrase).to eq('')
|
|
377
|
+
expect(results[0].host).to eq("example.com")
|
|
378
|
+
expect(results[0].user).to eq('john_doe')
|
|
379
|
+
expect(results[0].original).to eq(line)
|
|
380
|
+
|
|
381
|
+
line = 'john.doe@example.com'
|
|
382
|
+
results = MailAddress.parse(line)
|
|
383
|
+
expect(results[0].format).to eq('john.doe@example.com')
|
|
384
|
+
expect(results[0].address).to eq('john.doe@example.com')
|
|
385
|
+
expect(results[0].name).to be_nil
|
|
386
|
+
expect(results[0].phrase).to eq('')
|
|
387
|
+
expect(results[0].host).to eq("example.com")
|
|
388
|
+
expect(results[0].user).to eq('john.doe')
|
|
389
|
+
expect(results[0].original).to eq(line)
|
|
390
|
+
end
|
|
391
|
+
|
|
362
392
|
it "corrupted address" do
|
|
363
393
|
line = 'john <john@example.com' # lack of right angle bracket
|
|
364
394
|
expect {
|
|
@@ -466,9 +496,9 @@ describe MailAddress do
|
|
|
466
496
|
['Clive Bittlestone <clyvb@asic.sc.ti.com>',
|
|
467
497
|
'Clive Bittlestone <clyvb@asic.sc.ti.com>',
|
|
468
498
|
'Clive Bittlestone'],
|
|
469
|
-
['Graham.Barr@tiuk.ti.com',
|
|
470
|
-
|
|
471
|
-
|
|
499
|
+
# ['Graham.Barr@tiuk.ti.com',
|
|
500
|
+
# 'Graham.Barr@tiuk.ti.com',
|
|
501
|
+
# 'Graham Barr'],
|
|
472
502
|
# ['"Graham Bisset, UK Net Support, +44 224 728109" <GRAHAM@dyce.wireline.slb.com.ti.com.>',
|
|
473
503
|
# '"Graham Bisset, UK Net Support, +44 224 728109" <GRAHAM@dyce.wireline.slb.com.ti.com.>',
|
|
474
504
|
# 'Graham Bisset'],
|
|
@@ -481,9 +511,9 @@ describe MailAddress do
|
|
|
481
511
|
# ['a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))',
|
|
482
512
|
# 'a909062@node_cb83.node_cb83 (Colin Maytum (0013 bro5))',
|
|
483
513
|
# 'Colin Maytum'],
|
|
484
|
-
['Derek.Roskell%dero@msg.ti.com',
|
|
485
|
-
|
|
486
|
-
|
|
514
|
+
# ['Derek.Roskell%dero@msg.ti.com',
|
|
515
|
+
# 'Derek.Roskell%dero@msg.ti.com',
|
|
516
|
+
# 'Derek Roskell'],
|
|
487
517
|
# ['":sysmail"@ Some-Group. Some-Org, Muhammed.(I am the greatest) Ali @(the)Vegas.WBA',
|
|
488
518
|
# '":sysmail"@Some-Group.Some-Org',
|
|
489
519
|
# ''],
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mail_address
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kizashi Nagata
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-04-
|
|
11
|
+
date: 2015-04-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|